You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by je...@apache.org on 2014/01/08 23:22:52 UTC

git commit: DIRMINA-965: fix HTTP server decoding

Updated Branches:
  refs/heads/2.0 41811548e -> f029e2326


DIRMINA-965: fix HTTP server decoding


Project: http://git-wip-us.apache.org/repos/asf/mina/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina/commit/f029e232
Tree: http://git-wip-us.apache.org/repos/asf/mina/tree/f029e232
Diff: http://git-wip-us.apache.org/repos/asf/mina/diff/f029e232

Branch: refs/heads/2.0
Commit: f029e2326f33c5f11c359abe9be55dfacb530813
Parents: 4181154
Author: Jeff MAURY <je...@Jeffs-MacBook-Pro.local>
Authored: Wed Jan 8 23:21:16 2014 +0100
Committer: Jeff MAURY <je...@Jeffs-MacBook-Pro.local>
Committed: Wed Jan 8 23:21:16 2014 +0100

----------------------------------------------------------------------
 .../org/apache/mina/http/HttpServerDecoder.java |  1 -
 .../apache/mina/http/HttpServerDecoderTest.java | 78 ++++++++++++++++++++
 2 files changed, 78 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina/blob/f029e232/mina-http/src/main/java/org/apache/mina/http/HttpServerDecoder.java
----------------------------------------------------------------------
diff --git a/mina-http/src/main/java/org/apache/mina/http/HttpServerDecoder.java b/mina-http/src/main/java/org/apache/mina/http/HttpServerDecoder.java
index 61c1933..e491c6c 100644
--- a/mina-http/src/main/java/org/apache/mina/http/HttpServerDecoder.java
+++ b/mina-http/src/main/java/org/apache/mina/http/HttpServerDecoder.java
@@ -83,7 +83,6 @@ public class HttpServerDecoder implements ProtocolDecoder {
             // grab the stored a partial HEAD request
             final ByteBuffer oldBuffer = (ByteBuffer) session.getAttribute(PARTIAL_HEAD_ATT);
             // concat the old buffer and the new incoming one
-            IoBuffer.allocate(oldBuffer.remaining() + msg.remaining()).put(oldBuffer).put(msg).flip();
             // now let's decode like it was a new message
             msg = IoBuffer.allocate(oldBuffer.remaining() + msg.remaining()).put(oldBuffer).put(msg).flip();
         case NEW:

http://git-wip-us.apache.org/repos/asf/mina/blob/f029e232/mina-http/src/test/java/org/apache/mina/http/HttpServerDecoderTest.java
----------------------------------------------------------------------
diff --git a/mina-http/src/test/java/org/apache/mina/http/HttpServerDecoderTest.java b/mina-http/src/test/java/org/apache/mina/http/HttpServerDecoderTest.java
index e1a90d4..fbdd2f3 100644
--- a/mina-http/src/test/java/org/apache/mina/http/HttpServerDecoderTest.java
+++ b/mina-http/src/test/java/org/apache/mina/http/HttpServerDecoderTest.java
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertTrue;
 import java.nio.charset.CharacterCodingException;
 import java.nio.charset.Charset;
 import java.nio.charset.CharsetEncoder;
+
 import org.apache.mina.core.buffer.IoBuffer;
 import org.apache.mina.core.filterchain.IoFilter.NextFilter;
 import org.apache.mina.core.session.DummySession;
@@ -163,4 +164,81 @@ public class HttpServerDecoderTest {
         assertTrue(out.getMessageQueue().poll() instanceof IoBuffer);
         assertTrue(out.getMessageQueue().poll() instanceof HttpEndOfContent);
     }
+    
+    @Test
+    public void testDIRMINA965NoContent() throws Exception {
+        AbstractProtocolDecoderOutput out = new AbstractProtocolDecoderOutput() {
+            public void flush(NextFilter nextFilter, IoSession session) {
+            }
+        };
+        IoBuffer buffer = IoBuffer.allocate(0).setAutoExpand(true);
+        buffer.putString("GET / HTTP/1.1\r\nHost: ", encoder);
+        buffer.rewind();
+        while (buffer.hasRemaining()) {
+            decoder.decode(session, buffer, out);
+        }
+        buffer = IoBuffer.allocate(0).setAutoExpand(true);
+        buffer.putString("dummy\r\n\r\n", encoder);
+        buffer.rewind();
+        while (buffer.hasRemaining()) {
+            decoder.decode(session, buffer, out);
+        }
+        assertEquals(2, out.getMessageQueue().size());
+        assertTrue(out.getMessageQueue().poll() instanceof HttpRequest);
+        assertTrue(out.getMessageQueue().poll() instanceof HttpEndOfContent);
+    }
+
+    @Test
+    public void testDIRMINA965WithContent() throws Exception {
+        AbstractProtocolDecoderOutput out = new AbstractProtocolDecoderOutput() {
+            public void flush(NextFilter nextFilter, IoSession session) {
+            }
+        };
+        IoBuffer buffer = IoBuffer.allocate(0).setAutoExpand(true);
+        buffer.putString("GET / HTTP/1.1\r\nHost: ", encoder);
+        buffer.rewind();
+        while (buffer.hasRemaining()) {
+            decoder.decode(session, buffer, out);
+        }
+        buffer = IoBuffer.allocate(0).setAutoExpand(true);
+        buffer.putString("dummy\r\nContent-Length: 1\r\n\r\nA", encoder);
+        buffer.rewind();
+        while (buffer.hasRemaining()) {
+            decoder.decode(session, buffer, out);
+        }
+        assertEquals(3, out.getMessageQueue().size());
+        assertTrue(out.getMessageQueue().poll() instanceof HttpRequest);
+        assertTrue(out.getMessageQueue().poll() instanceof IoBuffer);
+        assertTrue(out.getMessageQueue().poll() instanceof HttpEndOfContent);
+    }
+    @Test
+    public void testDIRMINA965WithContentOnTwoChunks() throws Exception {
+        AbstractProtocolDecoderOutput out = new AbstractProtocolDecoderOutput() {
+            public void flush(NextFilter nextFilter, IoSession session) {
+            }
+        };
+        IoBuffer buffer = IoBuffer.allocate(0).setAutoExpand(true);
+        buffer.putString("GET / HTTP/1.1\r\nHost: ", encoder);
+        buffer.rewind();
+        while (buffer.hasRemaining()) {
+            decoder.decode(session, buffer, out);
+        }
+        buffer = IoBuffer.allocate(0).setAutoExpand(true);
+        buffer.putString("dummy\r\nContent-Length: 2\r\n\r\nA", encoder);
+        buffer.rewind();
+        while (buffer.hasRemaining()) {
+            decoder.decode(session, buffer, out);
+        }
+        buffer = IoBuffer.allocate(0).setAutoExpand(true);
+        buffer.putString("B", encoder);
+        buffer.rewind();
+        while (buffer.hasRemaining()) {
+            decoder.decode(session, buffer, out);
+        }
+        assertEquals(4, out.getMessageQueue().size());
+        assertTrue(out.getMessageQueue().poll() instanceof HttpRequest);
+        assertTrue(out.getMessageQueue().poll() instanceof IoBuffer);
+        assertTrue(out.getMessageQueue().poll() instanceof IoBuffer);
+        assertTrue(out.getMessageQueue().poll() instanceof HttpEndOfContent);
+    }
 }