/* * ==================================================================== * Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.internal.io.dav.http; import java.io.IOException; import java.io.InputStream; import java.text.ParseException; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * @version 1.3 * @author TMate Software Ltd. */ public class HTTPHeader { public static final String CONNECTION_HEADER = "Connection"; public static final String PROXY_CONNECTION_HEADER = "Proxy-Connection"; public static final String TRANSFER_ENCODING_HEADER = "Transfer-Encoding"; public static final String CONTENT_LENGTH_HEADER = "Content-Length"; public static final String CONTENT_ENCODING_HEADER = "Content-Encoding"; public static final String CONTENT_TYPE_HEADER = "Content-Type"; public static final String AUTHENTICATE_HEADER = "WWW-Authenticate"; public static final String PROXY_AUTHENTICATE_HEADER = "Proxy-Authenticate"; public static final String LOCATION_HEADER = "Location"; public static final String LOCK_OWNER_HEADER = "X-SVN-Lock-Owner"; public static final String CREATION_DATE_HEADER = "X-SVN-Creation-Date"; public static final String SVN_VERSION_NAME_HEADER = "X-SVN-Version-Name"; public static final String SVN_OPTIONS_HEADER = "X-SVN-Options"; public static final String TEXT_MD5 = "X-SVN-Result-Fulltext-MD5"; public static final String BASE_MD5 = "X-SVN-Base-Fulltext-MD5"; public static final String LOCK_TOKEN_HEADER = "Lock-Token"; public static final String IF_HEADER = "If"; public static final String DEPTH_HEADER = "Depth"; public static final String LABEL_HEADER = "Label"; public static final String DESTINATION_HEADER = "Destination"; public static final String TIMEOUT_HEADER = "Timeout"; public static final String DAV_HEADER = "DAV"; public static final String SVN_DELTA_BASE_HEADER = "X-SVN-VR-Base"; public static final String ACCEPT_ENCODING_HEADER = "Accept-Encoding"; public static final String CONTENT_RANGE_HEADER = "content-range"; public static final String HOST_HEADER = "Host"; public static final String NEW_URI_HEADER = "New-uri"; public static final String OVERWRITE_HEADER = "Overwrite"; public static final String SVNDIFF_MIME_TYPE = "application/vnd.svn-svndiff"; public static final String SET_COOKIE = "Set-Cookie"; public static final String COOKIE = "Cookie"; private Map<String, List<String>> myHeaders; public HTTPHeader() { } public String toString() { if (myHeaders == null) { return ""; } StringBuffer representation = new StringBuffer(); for(Iterator<String> headers = myHeaders.keySet().iterator(); headers.hasNext();){ String headerName = (String) headers.next(); Collection<String> headerValues = myHeaders.get(headerName); for(Iterator<String> values = headerValues.iterator(); values.hasNext();){ String value = (String) values.next(); representation.append(headerName); representation.append(": "); representation.append(value); representation.append(HTTPRequest.CRLF); } } return representation.toString(); } public void addHeaderValue(String name, String value) { Map<String, List<String>> headers = getHeaders(); List<String> values = headers.get(name); if (values == null) { values = new LinkedList<String>(); headers.put(name, values); } values.add(value); } public Map<String, List<String>> getRawHeaders() { return getHeaders(); } public List<String> getHeaderValues(String name) { if (myHeaders == null) { return null; } List<String> values = new LinkedList<String>(); for (Iterator<String> names = myHeaders.keySet().iterator(); names.hasNext();) { String headerName = (String) names.next(); if (name.equalsIgnoreCase(headerName)) { values.addAll(myHeaders.get(headerName)); } } return values.isEmpty() ? null : values; } public String getFirstHeaderValue(String name){ LinkedList<String> values = (LinkedList<String>) getHeaderValues(name); return values != null ? (String) values.getFirst() : null; } public boolean hasHeader(String name){ LinkedList<String> values = (LinkedList<String>) getHeaderValues(name); return values != null && !values.isEmpty(); } public void setHeaderValue(String name, String value){ Map<String, List<String>> headers = getHeaders(); List<String> values = headers.get(name); if (values == null) { values = new LinkedList<String>(); headers.put(name, values); } else { values.clear(); } values.add(value); } private Map<String, List<String>> getHeaders() { if (myHeaders == null) { myHeaders = new TreeMap<String, List<String>>(); } return myHeaders; } public static HTTPHeader parseHeader(InputStream is, String charset) throws IOException, ParseException { HTTPHeader headers = new HTTPHeader(); String name = null; StringBuffer value = null; for (; ;) { String line = HTTPParser.readLine(is, charset); if ((line == null) || (line.trim().length() < 1)) { break; } if ((line.charAt(0) == ' ') || (line.charAt(0) == '\t')) { if (value != null) { value.append(' '); value.append(line.trim()); } } else { if (name != null) { headers.addHeaderValue(name, value != null ? value.toString() : ""); } int colon = line.indexOf(":"); if (colon < 0) { throw new ParseException("Unable to parse header: " + line, 0); } name = line.substring(0, colon).trim(); value = new StringBuffer(line.substring(colon + 1).trim()); } } if (name != null) { headers.addHeaderValue(name, value != null ? value.toString() : ""); } return headers; } }