[prev in list] [next in list] [prev in thread] [next in thread] 

List:       httpcomponents-commits
Subject:    svn commit: r280116 - in /jakarta/httpclient/trunk/http-common/src:
From:       olegk () apache ! org
Date:       2005-09-11 12:49:13
Message-ID: 20050911124914.26716.qmail () minotaur ! apache ! org
[Download RAW message or body]

Author: olegk
Date: Sun Sep 11 05:49:02 2005
New Revision: 280116

URL: http://svn.apache.org/viewcvs?rev=280116&view=rev
Log:
Chunk-coding performance optimization

Modified:
    jakarta/httpclient/trunk/http-common/src/java/org/apache/http/io/ChunkedInputStream.java
  jakarta/httpclient/trunk/http-common/src/test/org/apache/http/io/TestChunkCoding.java


Modified: jakarta/httpclient/trunk/http-common/src/java/org/apache/http/io/ChunkedInputStream.java
                
URL: http://svn.apache.org/viewcvs/jakarta/httpclient/trunk/http-common/src/java/org/apache/http/io/ChunkedInputStream.java?rev=280116&r1=280115&r2=280116&view=diff
 ==============================================================================
--- jakarta/httpclient/trunk/http-common/src/java/org/apache/http/io/ChunkedInputStream.java \
                (original)
+++ jakarta/httpclient/trunk/http-common/src/java/org/apache/http/io/ChunkedInputStream.java \
Sun Sep 11 05:49:02 2005 @@ -29,13 +29,11 @@
 
 package org.apache.http.io;
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
 import org.apache.http.Header;
 import org.apache.http.HttpException;
-import org.apache.http.util.EncodingUtil;
 import org.apache.http.util.ExceptionUtil;
 import org.apache.http.util.HeadersParser;
 
@@ -227,28 +225,11 @@
     }
 
     /**
-     * Read the CRLF terminator.
-     * @throws IOException If an IO error occurs.
-     */
-    private void readCRLF() throws IOException {
-        int cr = in.read();
-        int lf = in.read();
-        if ((cr != '\r') || (lf != '\n')) { 
-            throw new MalformedChunkCodingException(
-                "CRLF expected at end of chunk: " + cr + "/" + lf);
-        }
-    }
-
-
-    /**
      * Read the next chunk.
      * @throws IOException If an IO error occurs.
      */
     private void nextChunk() throws IOException {
-        if (!bof) {
-            readCRLF();
-        }
-        chunkSize = getChunkSizeFromInputStream(in);
+        chunkSize = getChunkSize();
         bof = false;
         pos = 0;
         if (chunkSize == 0) {
@@ -270,60 +251,22 @@
      * 
      * @throws IOException when the chunk size could not be parsed
      */
-    private static int getChunkSizeFromInputStream(final HttpDataReceiver in) 
-      throws IOException {
-            
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        // States: 0=normal, 1=\r was scanned, 2=inside quoted string, -1=end
-        int state = 0; 
-        while (state != -1) {
-        int b = in.read();
-            if (b == -1) { 
-                throw new MalformedChunkCodingException("Chunked stream ended \
                unexpectedly");
-            }
-            switch (state) {
-                case 0: 
-                    switch (b) {
-                        case '\r':
-                            state = 1;
-                            break;
-                        case '\"':
-                            state = 2;
-                            /* fall through */
-                        default:
-                            baos.write(b);
-                    }
-                    break;
-
-                case 1:
-                    if (b == '\n') {
-                        state = -1;
-                    } else {
-                        // this was not CRLF
-                        throw new MalformedChunkCodingException("Unexpected"
-                            + " single newline character in chunk size");
-                    }
-                    break;
-
-                case 2:
-                    switch (b) {
-                        case '\\':
-                            b = in.read();
-                            baos.write(b);
-                            break;
-                        case '\"':
-                            state = 0;
-                            /* fall through */
-                        default:
-                            baos.write(b);
-                    }
-                    break;
-                default: throw new IllegalStateException("Invalid state condition");
+    private int getChunkSize() throws IOException {
+    	// skip CRLF
+    	if (!bof) {
+            int cr = in.read();
+            int lf = in.read();
+            if ((cr != '\r') || (lf != '\n')) { 
+                throw new MalformedChunkCodingException(
+                    "CRLF expected at end of chunk");
             }
         }
-
         //parse data
-        String dataString = EncodingUtil.getAsciiString(baos.toByteArray());
+        String dataString = this.in.readLine();
+        if (dataString == null) {
+            throw new MalformedChunkCodingException(
+            		"Chunked stream ended unexpectedly");
+        }
         int separator = dataString.indexOf(';');
         dataString = (separator > 0)
             ? dataString.substring(0, separator).trim()
@@ -331,7 +274,7 @@
 
         int result;
         try {
-            result = Integer.parseInt(dataString.trim(), 16);
+            result = Integer.parseInt(dataString, 16);
         } catch (NumberFormatException e) {
             throw new MalformedChunkCodingException("Bad chunk size: " + \
dataString);  }

Modified: jakarta/httpclient/trunk/http-common/src/test/org/apache/http/io/TestChunkCoding.java
                
URL: http://svn.apache.org/viewcvs/jakarta/httpclient/trunk/http-common/src/test/org/apache/http/io/TestChunkCoding.java?rev=280116&r1=280115&r2=280116&view=diff
 ==============================================================================
--- jakarta/httpclient/trunk/http-common/src/test/org/apache/http/io/TestChunkCoding.java \
                (original)
+++ jakarta/httpclient/trunk/http-common/src/test/org/apache/http/io/TestChunkCoding.java \
Sun Sep 11 05:49:02 2005 @@ -75,7 +75,7 @@
     }
 
     private final static String CHUNKED_INPUT 
-        = "10;key=\"value\\\r\nnewline\"\r\n1234567890123456\r\n5\r\n12345\r\n0\r\nFooter1: \
abcde\r\nFooter2: fghij\r\n"; +        = \
"10;key=\"value\"\r\n1234567890123456\r\n5\r\n12345\r\n0\r\nFooter1: \
abcde\r\nFooter2: fghij\r\n";  
     private final static String CHUNKED_RESULT 
         = "123456789012345612345";


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic