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 2007/06/16 13:44:26 UTC

svn commit: r547910 - in /jakarta/httpcomponents/httpcore/trunk: ./ module-main/src/main/java/org/apache/http/impl/ module-main/src/main/java/org/apache/http/util/ module-main/src/test/java/org/apache/http/util/ module-nio/src/main/java/org/apache/http...

Author: olegk
Date: Sat Jun 16 04:44:24 2007
New Revision: 547910

URL: http://svn.apache.org/viewvc?view=rev&rev=547910
Log:
HTTPCORE-81: Correctly enforce max line length when parsing folded header lines

Modified:
    jakarta/httpcomponents/httpcore/trunk/RELEASE_NOTES.txt
    jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/impl/AbstractHttpClientConnection.java
    jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/impl/AbstractHttpServerConnection.java
    jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/util/HeaderUtils.java
    jakarta/httpcomponents/httpcore/trunk/module-main/src/test/java/org/apache/http/util/TestHeaderUtils.java
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/codecs/HttpMessageParser.java

Modified: jakarta/httpcomponents/httpcore/trunk/RELEASE_NOTES.txt
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/RELEASE_NOTES.txt?view=diff&rev=547910&r1=547909&r2=547910
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/RELEASE_NOTES.txt (original)
+++ jakarta/httpcomponents/httpcore/trunk/RELEASE_NOTES.txt Sat Jun 16 04:44:24 2007
@@ -1,7 +1,8 @@
 Changes since 4.0 Alpha 4
 
 * [HTTPCORE-81]: Maximum line length and maximum header counts parameters are now 
-  correctly enforced in both base and NIO modules.
+  correctly enforced in both base and NIO modules. Fixed maximum line length check
+  when parsing folded header lines.
   Contributed by Steffen Pingel <spingel at limewire.com>
 
 * Added HTTP client handler implementation that allocates fixed size content 

Modified: jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/impl/AbstractHttpClientConnection.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/impl/AbstractHttpClientConnection.java?view=diff&rev=547910&r1=547909&r2=547910
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/impl/AbstractHttpClientConnection.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/impl/AbstractHttpClientConnection.java Sat Jun 16 04:44:24 2007
@@ -82,6 +82,7 @@
     private HttpDataTransmitter datatransmitter = null;
 
     private int maxHeaderCount = -1;
+    private int maxLineLen = -1;
     private int maxGarbageLines = -1;
 
     public AbstractHttpClientConnection() {
@@ -114,6 +115,8 @@
         this.datatransmitter = datatransmitter;
         this.maxHeaderCount = params.getIntParameter(
                 HttpConnectionParams.MAX_HEADER_COUNT, -1);
+        this.maxLineLen = params.getIntParameter(
+                HttpConnectionParams.MAX_LINE_LENGTH, -1);
         this.maxGarbageLines = params.getIntParameter(
                 HttpConnectionParams.MAX_STATUS_LINE_GARBAGE, Integer.MAX_VALUE);
     }
@@ -249,7 +252,10 @@
 
     protected void readResponseHeaders(final HttpResponse response) 
             throws HttpException, IOException {
-        Header[] headers = HeaderUtils.parseHeaders(this.datareceiver, this.maxHeaderCount);
+        Header[] headers = HeaderUtils.parseHeaders(
+                this.datareceiver, 
+                this.maxHeaderCount,
+                this.maxLineLen);
         response.setHeaders(headers);
     }
 

Modified: jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/impl/AbstractHttpServerConnection.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/impl/AbstractHttpServerConnection.java?view=diff&rev=547910&r1=547909&r2=547910
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/impl/AbstractHttpServerConnection.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/impl/AbstractHttpServerConnection.java Sat Jun 16 04:44:24 2007
@@ -80,6 +80,7 @@
     private HttpDataTransmitter datatransmitter = null;
 
     private int maxHeaderCount = -1;
+    private int maxLineLen = -1;
     
     public AbstractHttpServerConnection() {
         super();
@@ -111,6 +112,8 @@
         this.datatransmitter = datatransmitter;
         this.maxHeaderCount = params.getIntParameter(
                 HttpConnectionParams.MAX_HEADER_COUNT, -1);
+        this.maxLineLen = params.getIntParameter(
+                HttpConnectionParams.MAX_LINE_LENGTH, -1);
     }
     
     public HttpRequest receiveRequestHeader() 
@@ -144,7 +147,10 @@
     
     protected void receiveRequestHeaders(final HttpRequest request) 
             throws HttpException, IOException {
-        Header[] headers = HeaderUtils.parseHeaders(this.datareceiver, this.maxHeaderCount);
+        Header[] headers = HeaderUtils.parseHeaders(
+                this.datareceiver, 
+                this.maxHeaderCount,
+                this.maxLineLen);
         request.setHeaders(headers);
     }
 

Modified: jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/util/HeaderUtils.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/util/HeaderUtils.java?view=diff&rev=547910&r1=547909&r2=547910
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/util/HeaderUtils.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/util/HeaderUtils.java Sat Jun 16 04:44:24 2007
@@ -66,8 +66,10 @@
      * @throws HttpException
      * @throws IOException
      */
-    public static Header[] parseHeaders(final HttpDataReceiver datareceiver, int maxCount) 
-            throws HttpException, IOException {
+    public static Header[] parseHeaders(
+            final HttpDataReceiver datareceiver,
+            int maxHeaderCount,
+            int maxLineLen) throws HttpException, IOException {
         if (datareceiver == null) {
             throw new IllegalArgumentException("HTTP data receiver may not be null");
         }
@@ -100,6 +102,10 @@
                     }
                     i++;
                 }
+                if (maxLineLen > 0 
+                        && previous.length() + 1 + current.length() - i > maxLineLen) {
+                    throw new IOException("Maximum line length limit exceeded");
+                }
                 previous.append(' ');
                 previous.append(current, i, current.length() - i);
             } else {
@@ -107,7 +113,7 @@
                 previous = current;
                 current = null;
             }
-            if (maxCount > 0 && headerLines.size() >= maxCount) {
+            if (maxHeaderCount > 0 && headerLines.size() >= maxHeaderCount) {
                 throw new IOException("Maximum header count exceeded");
             }
         }
@@ -125,7 +131,7 @@
 
     public static Header[] parseHeaders(final HttpDataReceiver datareceiver) 
         throws HttpException, IOException {
-        return parseHeaders(datareceiver, -1);
+        return parseHeaders(datareceiver, -1, -1);
     }
     
 }

Modified: jakarta/httpcomponents/httpcore/trunk/module-main/src/test/java/org/apache/http/util/TestHeaderUtils.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-main/src/test/java/org/apache/http/util/TestHeaderUtils.java?view=diff&rev=547910&r1=547909&r2=547910
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-main/src/test/java/org/apache/http/util/TestHeaderUtils.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-main/src/test/java/org/apache/http/util/TestHeaderUtils.java Sat Jun 16 04:44:24 2007
@@ -184,12 +184,27 @@
             "\r\n"; 
         HttpDataReceiver receiver = new HttpDataReceiverMockup(s, "US-ASCII");
         try {
-            HeaderUtils.parseHeaders(receiver, 2);
+            HeaderUtils.parseHeaders(receiver, 2, -1);
             fail("IOException should have been thrown");
         } catch (IOException ex) {
             // expected
         }
     }
-        
+
+    public void testMaxHeaderCountForFoldedHeader() throws Exception {
+        String s = 
+            "header1: stuff\r\n" + 
+            " stuff \r\n" + 
+            " stuff\r\n" + 
+            "\r\n"; 
+        HttpDataReceiver receiver = new HttpDataReceiverMockup(s, "US-ASCII");
+        try {
+            HeaderUtils.parseHeaders(receiver, 2, 15);
+            fail("IOException should have been thrown");
+        } catch (IOException ex) {
+            // expected
+        }
+    }
+
 }
 

Modified: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/codecs/HttpMessageParser.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/codecs/HttpMessageParser.java?view=diff&rev=547910&r1=547909&r2=547910
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/codecs/HttpMessageParser.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/codecs/HttpMessageParser.java Sat Jun 16 04:44:24 2007
@@ -120,7 +120,8 @@
                 }
                 i++;
             }
-            if (this.maxLineLen > 0 && previous.length() + 1 + current.length() - i > this.maxLineLen) {
+            if (this.maxLineLen > 0 
+                    && previous.length() + 1 + current.length() - i > this.maxLineLen) {
                 throw new IOException("Maximum line length limit exceeded");
             }
             previous.append(' ');