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);
+ }
}