Fix a bug where HttpObjectAggregator doesn't always produce FullHttpMessage
- Fixes #2182 - Always convert an unfull invalid message to a full message
This commit is contained in:
parent
00d982994c
commit
f120b6c390
@ -25,7 +25,6 @@ import io.netty.channel.ChannelPipeline;
|
|||||||
import io.netty.handler.codec.DecoderResult;
|
import io.netty.handler.codec.DecoderResult;
|
||||||
import io.netty.handler.codec.MessageToMessageDecoder;
|
import io.netty.handler.codec.MessageToMessageDecoder;
|
||||||
import io.netty.handler.codec.TooLongFrameException;
|
import io.netty.handler.codec.TooLongFrameException;
|
||||||
import io.netty.util.ReferenceCountUtil;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -136,8 +135,8 @@ public class HttpObjectAggregator extends MessageToMessageDecoder<HttpObject> {
|
|||||||
|
|
||||||
if (!m.getDecoderResult().isSuccess()) {
|
if (!m.getDecoderResult().isSuccess()) {
|
||||||
removeTransferEncodingChunked(m);
|
removeTransferEncodingChunked(m);
|
||||||
|
out.add(toFullMessage(m));
|
||||||
this.currentMessage = null;
|
this.currentMessage = null;
|
||||||
out.add(ReferenceCountUtil.retain(m));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (msg instanceof HttpRequest) {
|
if (msg instanceof HttpRequest) {
|
||||||
@ -247,4 +246,25 @@ public class HttpObjectAggregator extends MessageToMessageDecoder<HttpObject> {
|
|||||||
currentMessage = null;
|
currentMessage = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static FullHttpMessage toFullMessage(HttpMessage msg) {
|
||||||
|
if (msg instanceof FullHttpMessage) {
|
||||||
|
return ((FullHttpMessage) msg).retain();
|
||||||
|
}
|
||||||
|
|
||||||
|
FullHttpMessage fullMsg;
|
||||||
|
if (msg instanceof HttpRequest) {
|
||||||
|
HttpRequest req = (HttpRequest) msg;
|
||||||
|
fullMsg = new DefaultFullHttpRequest(
|
||||||
|
req.getProtocolVersion(), req.getMethod(), req.getUri(), Unpooled.EMPTY_BUFFER, false);
|
||||||
|
} else if (msg instanceof HttpResponse) {
|
||||||
|
HttpResponse res = (HttpResponse) msg;
|
||||||
|
fullMsg = new DefaultFullHttpResponse(
|
||||||
|
res.getProtocolVersion(), res.getStatus(), Unpooled.EMPTY_BUFFER, false);
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
|
||||||
|
return fullMsg;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,8 @@ import org.junit.Test;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static io.netty.util.ReferenceCountUtil.releaseLater;
|
import static io.netty.util.ReferenceCountUtil.*;
|
||||||
|
import static org.hamcrest.CoreMatchers.*;
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
public class HttpObjectAggregatorTest {
|
public class HttpObjectAggregatorTest {
|
||||||
@ -186,4 +187,22 @@ public class HttpObjectAggregatorTest {
|
|||||||
checkContentBuffer(aggratedMessage);
|
checkContentBuffer(aggratedMessage);
|
||||||
assertNull(embedder.readInbound());
|
assertNull(embedder.readInbound());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBadRequest() {
|
||||||
|
EmbeddedChannel ch = new EmbeddedChannel(new HttpRequestDecoder(), new HttpObjectAggregator(1024 * 1024));
|
||||||
|
ch.writeInbound(Unpooled.copiedBuffer("GET / HTTP/1.0 with extra\r\n", CharsetUtil.UTF_8));
|
||||||
|
assertThat(ch.readInbound(), is(instanceOf(FullHttpRequest.class)));
|
||||||
|
assertNull(ch.readInbound());
|
||||||
|
ch.finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBadResponse() throws Exception {
|
||||||
|
EmbeddedChannel ch = new EmbeddedChannel(new HttpResponseDecoder(), new HttpObjectAggregator(1024 * 1024));
|
||||||
|
ch.writeInbound(Unpooled.copiedBuffer("HTTP/1.0 BAD_CODE Bad Server\r\n", CharsetUtil.UTF_8));
|
||||||
|
assertThat(ch.readInbound(), is(instanceOf(FullHttpResponse.class)));
|
||||||
|
assertNull(ch.readInbound());
|
||||||
|
ch.finish();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user