Index: module-main/src/test/java/org/apache/http/impl/io/TestMessageParser.java =================================================================== --- module-main/src/test/java/org/apache/http/impl/io/TestMessageParser.java (revision 591328) +++ module-main/src/test/java/org/apache/http/impl/io/TestMessageParser.java (working copy) @@ -39,6 +39,7 @@ import org.apache.http.ProtocolException; import org.apache.http.io.SessionInputBuffer; import org.apache.http.message.BufferedHeader; +import org.apache.http.message.BasicHeaderValueParser; import org.apache.http.mockup.SessionInputBufferMockup; import junit.framework.Test; @@ -74,7 +75,7 @@ // expected } try { - new BufferedHeader(null, null); + new BufferedHeader(null); fail("IllegalArgumentException should have been thrown"); } catch (IllegalArgumentException ex) { // expected @@ -120,7 +121,8 @@ assertNotNull(headers); assertEquals(1, headers.length); assertEquals("header1 : stuff; param1 = value1; param2 = \"value 2\" ", headers[0].toString()); - HeaderElement[] elements = headers[0].getElements(); + HeaderElement[] elements = + BasicHeaderValueParser.parseElements(headers[0].getValue(), null); assertNotNull(elements); assertEquals(1, elements.length); assertEquals("stuff", elements[0].getName()); Index: module-main/src/test/java/org/apache/http/message/TestHeader.java =================================================================== --- module-main/src/test/java/org/apache/http/message/TestHeader.java (revision 591328) +++ module-main/src/test/java/org/apache/http/message/TestHeader.java (working copy) @@ -85,25 +85,6 @@ Header header2 = new BasicHeader("name2", null); assertEquals("name2: ", header2.toString()); } - - public void testHeaderElements() { - Header header = new BasicHeader("name", "element1 = value1, element2; param1 = value1, element3"); - HeaderElement[] elements = header.getElements(); - assertNotNull(elements); - assertEquals(3, elements.length); - assertEquals("element1", elements[0].getName()); - assertEquals("value1", elements[0].getValue()); - assertEquals("element2", elements[1].getName()); - assertEquals(null, elements[1].getValue()); - assertEquals("element3", elements[2].getName()); - assertEquals(null, elements[2].getValue()); - assertEquals(1, elements[1].getParameters().length); - - header = new BasicHeader("name", null); - elements = header.getElements(); - assertNotNull(elements); - assertEquals(0, elements.length); - } } Index: module-main/src/main/java/org/apache/http/message/BasicLineParser.java =================================================================== --- module-main/src/main/java/org/apache/http/message/BasicLineParser.java (revision 591328) +++ module-main/src/main/java/org/apache/http/message/BasicLineParser.java (working copy) @@ -130,10 +130,12 @@ throws ParseException { if (buffer == null) { - throw new IllegalArgumentException("Char array buffer may not be null"); + throw new IllegalArgumentException + ("Char array buffer may not be null"); } if (cursor == null) { - throw new IllegalArgumentException("Parser cursor may not be null"); + throw new IllegalArgumentException + ("Parser cursor may not be null"); } final String protoname = this.protocol.getProtocol(); @@ -225,10 +227,12 @@ final ParserCursor cursor) { if (buffer == null) { - throw new IllegalArgumentException("Char array buffer may not be null"); + throw new IllegalArgumentException + ("Char array buffer may not be null"); } if (cursor == null) { - throw new IllegalArgumentException("Parser cursor may not be null"); + throw new IllegalArgumentException + ("Parser cursor may not be null"); } int index = cursor.getPos(); @@ -303,10 +307,12 @@ throws ParseException { if (buffer == null) { - throw new IllegalArgumentException("Char array buffer may not be null"); + throw new IllegalArgumentException + ("Char array buffer may not be null"); } if (cursor == null) { - throw new IllegalArgumentException("Parser cursor may not be null"); + throw new IllegalArgumentException + ("Parser cursor may not be null"); } int indexFrom = cursor.getPos(); @@ -395,10 +401,12 @@ throws ParseException { if (buffer == null) { - throw new IllegalArgumentException("Char array buffer may not be null"); + throw new IllegalArgumentException + ("Char array buffer may not be null"); } if (cursor == null) { - throw new IllegalArgumentException("Parser cursor may not be null"); + throw new IllegalArgumentException + ("Parser cursor may not be null"); } int indexFrom = cursor.getPos(); @@ -484,26 +492,15 @@ throws ParseException { // the actual parser code is in the constructor of BufferedHeader - return new BufferedHeader(buffer, getHeaderValueParser()); + return new BufferedHeader(buffer); } /** - * Obtains the header value parser to use. - * Called by {@link #parseHeader}. - * - * @return the header value parser, or - * null for the default - */ - protected HeaderValueParser getHeaderValueParser() { - return null; - } - - - /** * Helper to skip whitespace. */ - protected void skipWhitespace(final CharArrayBuffer buffer, final ParserCursor cursor) { + protected void skipWhitespace(final CharArrayBuffer buffer, + final ParserCursor cursor) { int pos = cursor.getPos(); int indexTo = cursor.getUpperBound(); while ((pos < indexTo) && Index: module-main/src/main/java/org/apache/http/message/BasicHeaderElementIterator.java =================================================================== --- module-main/src/main/java/org/apache/http/message/BasicHeaderElementIterator.java (revision 591328) +++ module-main/src/main/java/org/apache/http/message/BasicHeaderElementIterator.java (working copy) @@ -32,10 +32,13 @@ package org.apache.http.message; import java.util.NoSuchElementException; +import org.apache.http.Header; import org.apache.http.HeaderElement; import org.apache.http.HeaderElementIterator; import org.apache.http.HeaderIterator; +import org.apache.http.ParseException; + /** * Basic implementation of a {@link HeaderElementIterator}. * @@ -47,44 +50,97 @@ private final HeaderIterator headerIt; - private int currentElementIdx = -1; + private final HeaderValueParser valueParser; + + private HeaderElement[] currentElements; - private HeaderElement[] currentElements = null; + private int currentElementIdx; - private HeaderElement currentElement = null; - + private HeaderElement currentElement; + + /** - * Creates a new instance of BasicHeaderElementIterator + * Creates a new header element iterator with default parser. + * + * @param headerIterator the headers over which to iterate + * + * @throws ParseException if an invalid header value is encountered */ - public BasicHeaderElementIterator(final HeaderIterator headerIterator) { + public BasicHeaderElementIterator(final HeaderIterator headerIterator) + throws ParseException { + this(headerIterator, null); + } + + + /** + * Creates a new header element iterator. + * + * @param headerIterator the headers over which to iterate + * @param valueParser the parser for splitting headers into elements, + * or null for the default parser + * + * @throws ParseException if an invalid header value is encountered + */ + public BasicHeaderElementIterator(final HeaderIterator headerIterator, + final HeaderValueParser valueParser) + throws ParseException { + if (headerIterator == null) { - throw new IllegalArgumentException("Header iterator may not be null"); + throw new IllegalArgumentException + ("Header iterator may not be null"); } this.headerIt = headerIterator; - - if (this.headerIt.hasNext()) { - this.currentElementIdx = 0; - this.currentElements = this.headerIt.nextHeader().getElements(); - this.currentElement = findNext(); - } + this.valueParser = valueParser; + + splitNextHeader(); + this.currentElement = findNext(); } - protected HeaderElement findNext() { - HeaderElement tmpHeader; + /** + * Splits the next header into elements. + * If there is no next header, the attributes are set to indicate + * the end of the iteration. + * + * @throws ParseException if an invalid header value is encountered + */ + protected void splitNextHeader() + throws ParseException { + + if (!this.headerIt.hasNext()) { + this.currentElements = null; + this.currentElement = null; + return; + } + + Header nhdr = this.headerIt.nextHeader(); + String value = nhdr.getValue(); + if (value == null) { + throw new ParseException("Header without value in iteration."); + } + this.currentElements = + BasicHeaderValueParser.parseElements(value, this.valueParser); + this.currentElementIdx = 0; + + if (this.currentElements.length < 1) { + throw new ParseException("Header without elements in iteration."); + } + } + + + protected HeaderElement findNext() throws ParseException { - if (this.currentElementIdx == this.currentElements.length) { - if (!this.headerIt.hasNext()) { - return null; - } - this.currentElements = this.headerIt.nextHeader().getElements(); - this.currentElementIdx = 0; + if (this.currentElementIdx >= this.currentElements.length) { + splitNextHeader(); } - tmpHeader = this.currentElements[this.currentElementIdx++]; - return tmpHeader; - + HeaderElement result = null; + if (this.currentElements != null) { + result = this.currentElements[this.currentElementIdx++]; + } + return result; } + public boolean hasNext() { return (this.currentElement != null); @@ -110,4 +166,4 @@ throw new UnsupportedOperationException("Remove not supported"); } -} \ No newline at end of file +} Index: module-main/src/main/java/org/apache/http/message/BasicHeader.java =================================================================== --- module-main/src/main/java/org/apache/http/message/BasicHeader.java (revision 591328) +++ module-main/src/main/java/org/apache/http/message/BasicHeader.java (working copy) @@ -118,22 +118,4 @@ return BasicLineFormatter.DEFAULT.formatHeader(null, this).toString(); } - /** - * Returns an array of {@link HeaderElement}s constructed from my value. - * - * @see BasicHeaderValueParser#parseElements - * - * @return an array of header elements - * - * @throws ParseException in case of a parse error - */ - public HeaderElement[] getElements() throws ParseException { - if (this.value != null) { - // result intentionally not cached, it's probably not used again - return BasicHeaderValueParser.parseElements(this.value, null); - } else { - return new HeaderElement[] {}; - } - } - } Index: module-main/src/main/java/org/apache/http/message/BufferedHeader.java =================================================================== --- module-main/src/main/java/org/apache/http/message/BufferedHeader.java (revision 591328) +++ module-main/src/main/java/org/apache/http/message/BufferedHeader.java (working copy) @@ -63,24 +63,17 @@ */ private final int valuePos; - /** - * The parser for the header value, or null. - */ - private HeaderValueParser parser; - /** * Creates a new header from a buffer. * The name of the header will be parsed immediately, * the value only if it is accessed. * * @param buffer the buffer containing the header to represent - * @param parser the header value parser, or null * * @throws ParseException in case of a parse error */ - public BufferedHeader(final CharArrayBuffer buffer, - final HeaderValueParser parser) + public BufferedHeader(final CharArrayBuffer buffer) throws ParseException { super(); @@ -101,15 +94,9 @@ this.buffer = buffer; this.name = s; this.valuePos = colon + 1; - this.parser = parser; } - public BufferedHeader(final CharArrayBuffer buffer) - throws ParseException { - this(buffer, null); - } - public String getName() { return this.name; } @@ -118,23 +105,6 @@ return this.buffer.substringTrimmed(this.valuePos, this.buffer.length()); } - public HeaderValueParser getParser() { - return this.parser; - } - - public void setParser(HeaderValueParser parser) { - this.parser = parser; - } - - public HeaderElement[] getElements() throws ParseException { - HeaderValueParser hvp = this.parser; - if (hvp == null) - hvp = BasicHeaderValueParser.DEFAULT; - ParserCursor cursor = new ParserCursor(0, this.buffer.length()); - cursor.updatePos(this.valuePos); - return hvp.parseElements(this.buffer, cursor); - } - public int getValuePos() { return this.valuePos; } Index: module-main/src/main/java/org/apache/http/impl/entity/LaxContentLengthStrategy.java =================================================================== --- module-main/src/main/java/org/apache/http/impl/entity/LaxContentLengthStrategy.java (revision 591328) +++ module-main/src/main/java/org/apache/http/impl/entity/LaxContentLengthStrategy.java (working copy) @@ -38,6 +38,7 @@ import org.apache.http.ParseException; import org.apache.http.ProtocolException; import org.apache.http.entity.ContentLengthStrategy; +import org.apache.http.message.BasicHeaderValueParser; import org.apache.http.params.HttpParams; import org.apache.http.params.CoreProtocolPNames; import org.apache.http.protocol.HTTP; @@ -199,7 +200,8 @@ if (transferEncodingHeader != null) { HeaderElement[] encodings = null; try { - encodings = transferEncodingHeader.getElements(); + encodings = BasicHeaderValueParser.parseElements + (transferEncodingHeader.getValue(), null); } catch (ParseException px) { throw new ProtocolException ("Invalid Transfer-Encoding header value: " + Index: module-main/src/main/java/org/apache/http/Header.java =================================================================== --- module-main/src/main/java/org/apache/http/Header.java (revision 591328) +++ module-main/src/main/java/org/apache/http/Header.java (working copy) @@ -59,6 +59,6 @@ String getValue(); - HeaderElement[] getElements() throws ParseException; + //HeaderElement[] getElements() throws ParseException; } Index: module-main/src/main/java/org/apache/http/util/EntityUtils.java =================================================================== --- module-main/src/main/java/org/apache/http/util/EntityUtils.java (revision 591328) +++ module-main/src/main/java/org/apache/http/util/EntityUtils.java (working copy) @@ -36,10 +36,12 @@ import java.io.InputStreamReader; import java.io.Reader; +import org.apache.http.Header; import org.apache.http.HeaderElement; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.ParseException; +import org.apache.http.message.BasicHeaderValueParser; import org.apache.http.protocol.HTTP; /** @@ -92,8 +94,10 @@ throw new IllegalArgumentException("HTTP entity may not be null"); } String charset = null; - if (entity.getContentType() != null) { - HeaderElement values[] = entity.getContentType().getElements(); + Header contype = entity.getContentType(); + if ((contype != null) && (contype.getValue() != null)) { + HeaderElement values[] = + BasicHeaderValueParser.parseElements(contype.getValue(), null); if (values.length > 0) { NameValuePair param = values[0].getParameterByName("charset"); if (param != null) { Index: module-nio/src/main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java =================================================================== --- module-nio/src/main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java (revision 591328) +++ module-nio/src/main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java (working copy) @@ -138,7 +138,7 @@ for (int i = 0; i < this.trailerBufs.size(); i++) { CharArrayBuffer buffer = (CharArrayBuffer) this.trailerBufs.get(i); try { - this.footers[i] = new BufferedHeader(buffer, null); + this.footers[i] = new BufferedHeader(buffer); } catch (ParseException ex) { throw new IOException(ex.getMessage()); }