1069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/* 2069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/message/BufferedHeader.java $ 3069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $Revision: 604625 $ 4069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $Date: 2007-12-16 06:11:11 -0800 (Sun, 16 Dec 2007) $ 5069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 6069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * ==================================================================== 7069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one 8069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * or more contributor license agreements. See the NOTICE file 9069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * distributed with this work for additional information 10069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * regarding copyright ownership. The ASF licenses this file 11069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * to you under the Apache License, Version 2.0 (the 12069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * "License"); you may not use this file except in compliance 13069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * with the License. You may obtain a copy of the License at 14069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 15069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 16069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 17069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Unless required by applicable law or agreed to in writing, 18069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * software distributed under the License is distributed on an 19069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 20069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * KIND, either express or implied. See the License for the 21069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * specific language governing permissions and limitations 22069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * under the License. 23069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * ==================================================================== 24069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 25069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This software consists of voluntary contributions made by many 26069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * individuals on behalf of the Apache Software Foundation. For more 27069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * information on the Apache Software Foundation, please see 28069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <http://www.apache.org/>. 29069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 30069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 31069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 32069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpackage org.apache.http.message; 33069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 34069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.FormattedHeader; 35069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.HeaderElement; 36069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.ParseException; 37069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.util.CharArrayBuffer; 38069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 39069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/** 40069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This class represents a raw HTTP header whose content is parsed 'on demand' 41069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * only when the header value needs to be consumed. 42069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 43069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a> 44069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 45069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 46069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <!-- empty lines above to avoid 'svn diff' context problems --> 47069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @version $Revision: 604625 $ $Date: 2007-12-16 06:11:11 -0800 (Sun, 16 Dec 2007) $ 48069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 49069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpublic class BufferedHeader implements FormattedHeader, Cloneable { 50069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 51069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 52069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Header name. 53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 54069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project private final String name; 55069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * The buffer containing the entire header line. 58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project private final CharArrayBuffer buffer; 60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * The beginning of the header value in the buffer 63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project private final int valuePos; 65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Creates a new header from a buffer. 69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * The name of the header will be parsed immediately, 70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * the value only if it is accessed. 71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param buffer the buffer containing the header to represent 73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @throws ParseException in case of a parse error 75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public BufferedHeader(final CharArrayBuffer buffer) 77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throws ParseException { 78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project super(); 80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (buffer == null) { 81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throw new IllegalArgumentException 82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ("Char array buffer may not be null"); 83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project int colon = buffer.indexOf(':'); 85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (colon == -1) { 86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throw new ParseException 87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ("Invalid header: " + buffer.toString()); 88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 89069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project String s = buffer.substringTrimmed(0, colon); 90069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (s.length() == 0) { 91069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throw new ParseException 92069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ("Invalid header: " + buffer.toString()); 93069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 94069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.buffer = buffer; 95069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.name = s; 96069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.valuePos = colon + 1; 97069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 98069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 99069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 100069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String getName() { 101069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return this.name; 102069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 103069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 104069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String getValue() { 105069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return this.buffer.substringTrimmed(this.valuePos, this.buffer.length()); 106069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 107069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 108069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public HeaderElement[] getElements() throws ParseException { 109069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ParserCursor cursor = new ParserCursor(0, this.buffer.length()); 110069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project cursor.updatePos(this.valuePos); 111069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return BasicHeaderValueParser.DEFAULT 112069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project .parseElements(this.buffer, cursor); 113069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 114069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 115069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public int getValuePos() { 116069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return this.valuePos; 117069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 118069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 119069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public CharArrayBuffer getBuffer() { 120069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return this.buffer; 121069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 122069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 123069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String toString() { 124069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return this.buffer.toString(); 125069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 126069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 127069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public Object clone() throws CloneNotSupportedException { 128069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // buffer is considered immutable 129069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project // no need to make a copy of it 130069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return super.clone(); 131069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 132069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 133069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 134