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;