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());
}