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/10/23 21:54:37 UTC

svn commit: r327848 - in /jakarta/httpclient/trunk/http-core/src: java/org/apache/http/util/HeadersParser.java test/org/apache/http/util/TestHeadersParser.java

Author: olegk
Date: Sun Oct 23 12:54:27 2005
New Revision: 327848

URL: http://svn.apache.org/viewcvs?rev=327848&view=rev
Log:
GC optimization. Use CharArrayBuffer-s internally to reduce the amount of garbage generated when parsing HTTP headers

Modified:
    jakarta/httpclient/trunk/http-core/src/java/org/apache/http/util/HeadersParser.java
    jakarta/httpclient/trunk/http-core/src/test/org/apache/http/util/TestHeadersParser.java

Modified: jakarta/httpclient/trunk/http-core/src/java/org/apache/http/util/HeadersParser.java
URL: http://svn.apache.org/viewcvs/jakarta/httpclient/trunk/http-core/src/java/org/apache/http/util/HeadersParser.java?rev=327848&r1=327847&r2=327848&view=diff
==============================================================================
--- jakarta/httpclient/trunk/http-core/src/java/org/apache/http/util/HeadersParser.java (original)
+++ jakarta/httpclient/trunk/http-core/src/java/org/apache/http/util/HeadersParser.java Sun Oct 23 12:54:27 2005
@@ -55,31 +55,46 @@
     public static Header[] processHeaders(final HttpDataReceiver datareceiver) 
             throws HttpException, IOException {
         ArrayList headerLines = new ArrayList();
+        
+        CharArrayBuffer current = null;
+        CharArrayBuffer previous = null;
         for (;;) {
-            String line = datareceiver.readLine();
-            if ((line == null) || (line.length() < 1)) {
+            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 ((line.charAt(0) == ' ' || line.charAt(0) == '\t') && !headerLines.isEmpty()) {
+            if ((current.charAt(0) == ' ' || current.charAt(0) == '\t') && previous != null) {
                 // we have continuation folded header
                 // so append value
-                String previousLine = (String) headerLines.remove(headerLines.size() - 1);
-                CharArrayBuffer buffer = new CharArrayBuffer(128);
-                buffer.append(previousLine);
-                buffer.append(' ');
-                buffer.append(line.trim());
-                headerLines.add(buffer.toString());
+                int i = 0;
+                while (i < current.length()) {
+                    char ch = current.charAt(i);
+                    if (ch != ' ' && ch != '\t') {
+                        break;
+                    }
+                    i++;
+                }
+                previous.append(' ');
+                previous.append(current.getBuffer(), i, current.length() - i);
             } else {
-                headerLines.add(line.trim());
+                headerLines.add(current);
+                previous = current;
+                current = null;
             }
         }
         Header[] headers = new Header[headerLines.size()];
         for (int i = 0; i < headerLines.size(); i++) {
-            headers[i] = Header.parse((String) headerLines.get(i));
+            CharArrayBuffer buffer = (CharArrayBuffer) headerLines.get(i);
+            headers[i] = Header.parse(buffer.toString());
         }
         return headers;
     }

Modified: jakarta/httpclient/trunk/http-core/src/test/org/apache/http/util/TestHeadersParser.java
URL: http://svn.apache.org/viewcvs/jakarta/httpclient/trunk/http-core/src/test/org/apache/http/util/TestHeadersParser.java?rev=327848&r1=327847&r2=327848&view=diff
==============================================================================
--- jakarta/httpclient/trunk/http-core/src/test/org/apache/http/util/TestHeadersParser.java (original)
+++ jakarta/httpclient/trunk/http-core/src/test/org/apache/http/util/TestHeadersParser.java Sun Oct 23 12:54:27 2005
@@ -64,6 +64,7 @@
             "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 = HeadersParser.processHeaders(receiver);