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 <[email protected]> Authored: Wed Jan 8 23:21:16 2014 +0100 Committer: Jeff MAURY <[email protected]> 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); + } }
