You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2005/12/01 22:04:36 UTC
svn commit: r351468 - in /jakarta/httpcomponents/trunk/http-core/src:
java/org/apache/http/ java/org/apache/http/impl/ java/org/apache/http/io/
java/org/apache/http/util/ test/org/apache/http/ test/org/apache/http/util/
Author: olegk
Date: Thu Dec 1 13:04:21 2005
New Revision: 351468
URL: http://svn.apache.org/viewcvs?rev=351468&view=rev
Log:
HeaderParser code moved to Header class
Removed:
jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/util/HeaderParser.java
jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/util/TestHeadersParser.java
Modified:
jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/Header.java
jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpClientConnection.java
jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpServerConnection.java
jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/io/ChunkedInputStream.java
jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeader.java
jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/util/TestAllUtil.java
Modified: jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/Header.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/Header.java?rev=351468&r1=351467&r2=351468&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/Header.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/Header.java Thu Dec 1 13:04:21 2005
@@ -29,7 +29,11 @@
package org.apache.http;
+import java.io.IOException;
+import java.util.ArrayList;
+
import org.apache.http.io.CharArrayBuffer;
+import org.apache.http.io.HttpDataReceiver;
/**
* <p>An HTTP header.</p>
@@ -177,6 +181,52 @@
*/
public HeaderElement[] getElements() {
return HeaderElement.parseAll(this.buffer, this.posValue, this.buffer.length());
+ }
+
+ public static Header[] parseAll(final HttpDataReceiver datareceiver)
+ throws HttpException, IOException {
+ ArrayList headerLines = new ArrayList();
+
+ CharArrayBuffer current = null;
+ CharArrayBuffer previous = null;
+ for (;;) {
+ if (current == null) {
+ current = new CharArrayBuffer(64);
+ } else {
+ current.clear();
+ }
+ int l = datareceiver.readLine(current);
+ if (l == -1 || current.length() < 1) {
+ break;
+ }
+ // Parse the header name and value
+ // Check for folded headers first
+ // Detect LWS-char see HTTP/1.0 or HTTP/1.1 Section 2.2
+ // discussion on folded headers
+ if ((current.charAt(0) == ' ' || current.charAt(0) == '\t') && previous != null) {
+ // we have continuation folded header
+ // so append value
+ int i = 0;
+ while (i < current.length()) {
+ char ch = current.charAt(i);
+ if (ch != ' ' && ch != '\t') {
+ break;
+ }
+ i++;
+ }
+ previous.append(' ');
+ previous.append(current, i, current.length() - i);
+ } else {
+ headerLines.add(current);
+ previous = current;
+ current = null;
+ }
+ }
+ Header[] headers = new Header[headerLines.size()];
+ for (int i = 0; i < headerLines.size(); i++) {
+ headers[i] = new Header((CharArrayBuffer) headerLines.get(i));
+ }
+ return headers;
}
}
Modified: jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpClientConnection.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpClientConnection.java?rev=351468&r1=351467&r2=351468&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpClientConnection.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpClientConnection.java Thu Dec 1 13:04:21 2005
@@ -57,7 +57,6 @@
import org.apache.http.io.SocketFactory;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
-import org.apache.http.util.HeaderParser;
/**
* <p>
@@ -332,7 +331,7 @@
protected void readResponseHeaders(
final HttpMutableResponse response) throws HttpException, IOException {
- Header[] headers = HeaderParser.parse(this.datareceiver);
+ Header[] headers = Header.parseAll(this.datareceiver);
for (int i = 0; i < headers.length; i++) {
response.addHeader(headers[i]);
if (isWirelogEnabled()) {
Modified: jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpServerConnection.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpServerConnection.java?rev=351468&r1=351467&r2=351468&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpServerConnection.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpServerConnection.java Thu Dec 1 13:04:21 2005
@@ -49,7 +49,6 @@
import org.apache.http.impl.entity.EntityWriter;
import org.apache.http.io.CharArrayBuffer;
import org.apache.http.params.HttpParams;
-import org.apache.http.util.HeaderParser;
/**
* <p>
@@ -123,7 +122,7 @@
protected void receiveRequestHeaders(final HttpMutableRequest request)
throws HttpException, IOException {
- Header[] headers = HeaderParser.parse(this.datareceiver);
+ Header[] headers = Header.parseAll(this.datareceiver);
for (int i = 0; i < headers.length; i++) {
request.addHeader(headers[i]);
if (isWirelogEnabled()) {
Modified: jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/io/ChunkedInputStream.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/io/ChunkedInputStream.java?rev=351468&r1=351467&r2=351468&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/io/ChunkedInputStream.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/io/ChunkedInputStream.java Thu Dec 1 13:04:21 2005
@@ -35,7 +35,6 @@
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.util.ExceptionUtils;
-import org.apache.http.util.HeaderParser;
/**
* <p>This class implements chunked transfer coding as described in the
@@ -289,7 +288,7 @@
*/
private void parseTrailerHeaders() throws IOException {
try {
- this.footers = HeaderParser.parse(in);
+ this.footers = Header.parseAll(in);
} catch (HttpException e) {
IOException ioe = new MalformedChunkCodingException("Invalid footer: "
+ e.getMessage());
Modified: jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeader.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeader.java?rev=351468&r1=351467&r2=351468&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeader.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeader.java Thu Dec 1 13:04:21 2005
@@ -30,6 +30,8 @@
package org.apache.http;
import org.apache.http.io.CharArrayBuffer;
+import org.apache.http.io.HttpDataReceiver;
+import org.apache.http.mockup.HttpDataReceiverMockup;
import junit.framework.Test;
import junit.framework.TestCase;
@@ -146,5 +148,48 @@
assertEquals(1, elements[1].getParameters().length);
}
+ public void testBasicHeaderParsing() throws Exception {
+ String s =
+ "header1: stuff\r\n" +
+ "header2 : stuff \r\n" +
+ "header3: stuff\r\n" +
+ " and more stuff\r\n" +
+ "\t and even more stuff\r\n" +
+ " \r\n" +
+ "\r\n";
+ HttpDataReceiver receiver = new HttpDataReceiverMockup(s, "US-ASCII");
+ Header[] headers = Header.parseAll(receiver);
+ assertNotNull(headers);
+ assertEquals(3, headers.length);
+ assertEquals("header1", headers[0].getName());
+ assertEquals("stuff", headers[0].getValue());
+ assertEquals("header2", headers[1].getName());
+ assertEquals("stuff", headers[1].getValue());
+ assertEquals("header3", headers[2].getName());
+ assertEquals("stuff and more stuff and even more stuff", headers[2].getValue());
+ }
+
+ public void testParsingMalformedFirstHeader() throws Exception {
+ String s =
+ " header1: stuff\r\n" +
+ "header2 : stuff \r\n";
+ HttpDataReceiver receiver = new HttpDataReceiverMockup(s, "US-ASCII");
+ Header[] headers = Header.parseAll(receiver);
+ assertNotNull(headers);
+ assertEquals(2, headers.length);
+ assertEquals("header1", headers[0].getName());
+ assertEquals("stuff", headers[0].getValue());
+ assertEquals("header2", headers[1].getName());
+ assertEquals("stuff", headers[1].getValue());
+ }
+
+ public void testEmptyDataStream() throws Exception {
+ String s = "";
+ HttpDataReceiver receiver = new HttpDataReceiverMockup(s, "US-ASCII");
+ Header[] headers = Header.parseAll(receiver);
+ assertNotNull(headers);
+ assertEquals(0, headers.length);
+ }
+
}
Modified: jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/util/TestAllUtil.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/util/TestAllUtil.java?rev=351468&r1=351467&r2=351468&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/util/TestAllUtil.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/util/TestAllUtil.java Thu Dec 1 13:04:21 2005
@@ -42,7 +42,6 @@
suite.addTest(TestExceptionUtils.suite());
suite.addTest(TestEncodingUtils.suite());
suite.addTest(TestParameterFormatter.suite());
- suite.addTest(TestHeadersParser.suite());
suite.addTest(TestDateUtils.suite());
suite.addTest(TestEntityUtils.suite());
return suite;