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/03/12 21:23:25 UTC
svn commit: r517372 - in
/jakarta/httpcomponents/httpcore/trunk/module-nio/src:
main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java
test/java/org/apache/http/impl/nio/codecs/TestChunkDecoder.java
Author: olegk
Date: Mon Mar 12 13:23:24 2007
New Revision: 517372
URL: http://svn.apache.org/viewvc?view=rev&rev=517372
Log:
Code optimization in the ChunkDecoder class: attempt to read data from the channel only if the session buffer is empty or next chunk is expected
Modified:
jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java
jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/impl/nio/codecs/TestChunkDecoder.java
Modified: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java?view=diff&rev=517372&r1=517371&r2=517372
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/codecs/ChunkDecoder.java Mon Mar 12 13:23:24 2007
@@ -150,14 +150,16 @@
return -1;
}
- int bytesRead = this.buffer.fill(this.channel);
- if (bytesRead == -1) {
- this.endOfStream = true;
- }
-
int totalRead = 0;
while (this.state != COMPLETED) {
+ if (!this.buffer.hasData() || this.chunkSize == -1) {
+ int bytesRead = this.buffer.fill(this.channel);
+ if (bytesRead == -1) {
+ this.endOfStream = true;
+ }
+ }
+
switch (this.state) {
case READ_CONTENT:
@@ -173,6 +175,7 @@
}
if (this.chunkSize == 0) {
// Last chunk. Read footers
+ this.chunkSize = -1;
this.state = READ_FOOTERS;
break;
}
Modified: jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/impl/nio/codecs/TestChunkDecoder.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/impl/nio/codecs/TestChunkDecoder.java?view=diff&rev=517372&r1=517371&r2=517372
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/impl/nio/codecs/TestChunkDecoder.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/impl/nio/codecs/TestChunkDecoder.java Mon Mar 12 13:23:24 2007
@@ -110,8 +110,15 @@
ChunkDecoder decoder = new ChunkDecoder(channel, inbuf);
ByteBuffer dst = ByteBuffer.allocate(1024);
+
+ int bytesRead = 0;
+ while (dst.hasRemaining() && !decoder.isCompleted()) {
+ int i = decoder.read(dst);
+ if (i > 0) {
+ bytesRead += i;
+ }
+ }
- int bytesRead = decoder.read(dst);
assertEquals(26, bytesRead);
assertEquals("12345678901234561234512345", convert(dst));
@@ -137,31 +144,24 @@
SessionInputBuffer inbuf = new SessionInputBuffer(1024, 256);
ChunkDecoder decoder = new ChunkDecoder(channel, inbuf);
- ByteBuffer dst = ByteBuffer.allocate(4);
-
- int bytesRead = decoder.read(dst);
- assertEquals(4, bytesRead);
- assertEquals("0123", convert(dst));
- assertFalse(decoder.isCompleted());
-
- dst.clear();
- bytesRead = decoder.read(dst);
- assertEquals(4, bytesRead);
- assertEquals("4567", convert(dst));
- assertFalse(decoder.isCompleted());
-
- dst.clear();
- bytesRead = decoder.read(dst);
- assertEquals(4, bytesRead);
- assertEquals("89ab", convert(dst));
- assertFalse(decoder.isCompleted());
+ ByteBuffer dst = ByteBuffer.allocate(1024);
+ ByteBuffer tmp = ByteBuffer.allocate(4);
- dst.clear();
- bytesRead = decoder.read(dst);
- assertEquals(4, bytesRead);
- assertEquals("cdef", convert(dst));
- assertTrue(decoder.isCompleted());
+ int bytesRead = 0;
+ while (dst.hasRemaining() && !decoder.isCompleted()) {
+ int i = decoder.read(tmp);
+ if (i > 0) {
+ bytesRead += i;
+ }
+ tmp.flip();
+ dst.put(tmp);
+ tmp.compact();
+ }
+ assertEquals(16, bytesRead);
+ assertEquals("0123456789abcdef", convert(dst));
+ assertTrue(decoder.isCompleted());
+
dst.clear();
bytesRead = decoder.read(dst);
assertEquals(-1, bytesRead);
@@ -187,52 +187,19 @@
ByteBuffer dst = ByteBuffer.allocate(1024);
ChunkDecoder decoder = new ChunkDecoder(channel, inbuf);
- int bytesRead = decoder.read(dst);
- assertEquals(0, bytesRead);
- assertFalse(decoder.isCompleted());
- bytesRead = decoder.read(dst);
- assertEquals(0, bytesRead);
- assertFalse(decoder.isCompleted());
-
- bytesRead = decoder.read(dst);
- assertEquals(15, bytesRead);
- assertEquals("123456789012345", convert(dst));
- assertFalse(decoder.isCompleted());
-
- dst.clear();
- bytesRead = decoder.read(dst);
- assertEquals(3, bytesRead);
- assertEquals("612", convert(dst));
- assertFalse(decoder.isCompleted());
-
- dst.clear();
- bytesRead = decoder.read(dst);
- assertEquals(3, bytesRead);
- assertEquals("345", convert(dst));
- assertFalse(decoder.isCompleted());
-
- dst.clear();
- bytesRead = decoder.read(dst);
- assertEquals(6, bytesRead);
- assertEquals("abcdef", convert(dst));
- assertFalse(decoder.isCompleted());
-
- dst.clear();
- bytesRead = decoder.read(dst);
- assertEquals(0, bytesRead);
- assertFalse(decoder.isCompleted());
-
- dst.clear();
- bytesRead = decoder.read(dst);
- assertEquals(0, bytesRead);
- assertFalse(decoder.isCompleted());
-
- dst.clear();
- bytesRead = decoder.read(dst);
- assertEquals(0, bytesRead);
+ int bytesRead = 0;
+ while (dst.hasRemaining() && !decoder.isCompleted()) {
+ int i = decoder.read(dst);
+ if (i > 0) {
+ bytesRead += i;
+ }
+ }
+
+ assertEquals(27, bytesRead);
+ assertEquals("123456789012345612345abcdef", convert(dst));
assertTrue(decoder.isCompleted());
-
+
Header[] footers = decoder.getFooters();
assertEquals(2, footers.length);
assertEquals("Footer1", footers[0].getName());
@@ -332,14 +299,17 @@
ChunkDecoder decoder = new ChunkDecoder(channel, inbuf);
ByteBuffer dst = ByteBuffer.allocate(1024);
+
+ int bytesRead = 0;
+ while (dst.hasRemaining() && !decoder.isCompleted()) {
+ int i = decoder.read(dst);
+ if (i > 0) {
+ bytesRead += i;
+ }
+ }
- int bytesRead = decoder.read(dst);
assertEquals(26, bytesRead);
assertEquals("12345678901234561234512345", convert(dst));
- assertFalse(decoder.isCompleted());
-
- bytesRead = decoder.read(dst);
- assertEquals(0, bytesRead);
assertTrue(decoder.isCompleted());
}
@@ -353,14 +323,17 @@
ChunkDecoder decoder = new ChunkDecoder(channel, inbuf);
ByteBuffer dst = ByteBuffer.allocate(1024);
+
+ int bytesRead = 0;
+ while (dst.hasRemaining() && !decoder.isCompleted()) {
+ int i = decoder.read(dst);
+ if (i > 0) {
+ bytesRead += i;
+ }
+ }
- int bytesRead = decoder.read(dst);
assertEquals(26, bytesRead);
assertEquals("12345678901234561234512345", convert(dst));
- assertFalse(decoder.isCompleted());
-
- bytesRead = decoder.read(dst);
- assertEquals(0, bytesRead);
assertTrue(decoder.isCompleted());
}