/* * This file is part of the OWASP Proxy, a free intercepting proxy library. * Copyright (C) 2008-2010 Rogan Dawes <rogan@dawes.za.net> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to: * The Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ package org.owasp.proxy.http; public interface MutableResponseHeader extends ResponseHeader, MutableMessageHeader { void setVersion(String version) throws MessageFormatException; void setStatus(String status) throws MessageFormatException; void setReason(String reason) throws MessageFormatException; void setHeaderTime(long time); void setContentTime(long time); public static class Impl extends MutableMessageHeader.Impl implements MutableResponseHeader { private long headerTime = 0, contentTime = 0; protected String[] get100Header(String[] lines) { if (lines == null || lines.length < 3) // "100 Continue" // BLANK // BLANK return null; String[] parts = lines[0].split("[ \t]+", 3); if (parts.length < 2 || !"100".equals(parts[1])) return null; // It's a 100 response, now look for a blank line int sep = -1; for (int i = 0; i < lines.length; i++) { if ("".equals(lines[i])) { sep = i; break; } } if (sep == -1 || sep == lines.length - 1) return null; String[] h = new String[sep + 1]; System.arraycopy(lines, 0, h, 0, sep + 1); return h; } /* * (non-Javadoc) * * @see org.owasp.proxy.httpclient.MutableMessageHeader.Impl#getHeaderLines (byte[]) */ @Override protected String[] getHeaderLines() throws MessageFormatException { String[] lines = super.getHeaderLines(); String[] contHeader = get100Header(lines); if (contHeader != null) { String[] t = new String[lines.length - contHeader.length]; System.arraycopy(lines, contHeader.length, t, 0, t.length); return t; } return lines; } /* * (non-Javadoc) * * @see org.owasp.proxy.httpclient.MutableMessageHeader.Impl#setHeaderLines (java.lang.String[], byte[]) */ @Override protected void setHeaderLines(String[] lines) throws MessageFormatException { String[] contHeader = get100Header(super.getHeaderLines()); if (contHeader != null) { String[] t = new String[contHeader.length + lines.length]; System.arraycopy(contHeader, 0, t, 0, contHeader.length); System.arraycopy(lines, 0, t, contHeader.length, lines.length); lines = t; } super.setHeaderLines(lines); } /* * (non-Javadoc) * * @see org.owasp.proxy.httpclient.ResponseHeader#has100Continue() */ public boolean has100Continue() throws MessageFormatException { String[] contHeader = get100Header(super.getHeaderLines()); return contHeader != null; } public void setVersion(String version) throws MessageFormatException { String[] parts = getStartParts(); if (parts.length < 1) { setStartParts(new String[] { version }); } else { parts[0] = version; setStartParts(parts); } } public String getVersion() throws MessageFormatException { String[] parts = getStartParts(); if (parts.length == 0) return null; return "".equals(parts[0]) ? null : parts[0]; } public void setStatus(String status) throws MessageFormatException { String[] parts = getStartParts(); if (parts.length < 2) { String[] p = new String[2]; p[0] = parts.length >= 1 ? parts[0] : "HTTP/1.0"; parts = p; } parts[1] = status; setStartParts(parts); } public String getStatus() throws MessageFormatException { String[] parts = getStartParts(); if (parts.length < 2) return null; return "".equals(parts[1]) ? null : parts[1]; } public void setReason(String reason) throws MessageFormatException { String[] parts = getStartParts(); if (parts.length < 3) { String[] p = new String[3]; p[0] = parts.length >= 1 ? parts[0] : "HTTP/1.0"; p[1] = parts.length >= 2 ? parts[1] : "200"; parts = p; } parts[2] = reason; setStartParts(parts); } public String getReason() throws MessageFormatException { String[] parts = getStartParts(); if (parts.length < 3) return null; return "".equals(parts[2]) ? null : parts[2]; } /* * (non-Javadoc) * * @see org.owasp.httpclient.MutableResponseHeader#setHeaderStartedTime(long) */ public void setHeaderTime(long time) { headerTime = time; } /* * (non-Javadoc) * * @see org.owasp.httpclient.ResponseHeader#getHeaderCompletedTime() */ public long getHeaderTime() { return headerTime; } public void setContentTime(long time) { contentTime = time; } /* * (non-Javadoc) * * @see org.owasp.httpclient.StreamingResponse#getContentCompletedTime() */ public long getContentTime() { return contentTime; } } }