Correctly discard messages after oversized message is detected. (#9015)
Motivation:
32563bfcc1
introduced a regression in which we did now not longer discard the messages after we handled an oversized message.
Modifications:
- Do not set aggregating to false after handleOversizedMessage is called
- Adjust unit tests to verify the behaviour is correct again.
Result:
Fixes https://github.com/netty/netty/issues/9007.
This commit is contained in:
parent
9f2221ebd4
commit
ec21e575d7
@ -36,6 +36,7 @@ import java.util.List;
|
|||||||
import static io.netty.handler.codec.http.HttpHeadersTestUtils.of;
|
import static io.netty.handler.codec.http.HttpHeadersTestUtils.of;
|
||||||
import static org.hamcrest.CoreMatchers.instanceOf;
|
import static org.hamcrest.CoreMatchers.instanceOf;
|
||||||
import static org.hamcrest.CoreMatchers.is;
|
import static org.hamcrest.CoreMatchers.is;
|
||||||
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
@ -166,11 +167,48 @@ public class HttpObjectAggregatorTest {
|
|||||||
assertEquals(HttpResponseStatus.REQUEST_ENTITY_TOO_LARGE, response.status());
|
assertEquals(HttpResponseStatus.REQUEST_ENTITY_TOO_LARGE, response.status());
|
||||||
assertEquals("0", response.headers().get(HttpHeaderNames.CONTENT_LENGTH));
|
assertEquals("0", response.headers().get(HttpHeaderNames.CONTENT_LENGTH));
|
||||||
|
|
||||||
|
assertThat(response, instanceOf(LastHttpContent.class));
|
||||||
|
ReferenceCountUtil.release(response);
|
||||||
|
|
||||||
if (serverShouldCloseConnection(message, response)) {
|
if (serverShouldCloseConnection(message, response)) {
|
||||||
assertFalse(embedder.isOpen());
|
assertFalse(embedder.isOpen());
|
||||||
|
|
||||||
|
try {
|
||||||
|
embedder.writeInbound(new DefaultHttpContent(Unpooled.EMPTY_BUFFER));
|
||||||
|
fail();
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertThat(e, instanceOf(ClosedChannelException.class));
|
||||||
|
// expected
|
||||||
|
}
|
||||||
assertFalse(embedder.finish());
|
assertFalse(embedder.finish());
|
||||||
} else {
|
} else {
|
||||||
assertTrue(embedder.isOpen());
|
assertTrue(embedder.isOpen());
|
||||||
|
assertFalse(embedder.writeInbound(new DefaultHttpContent(Unpooled.copiedBuffer(new byte[8]))));
|
||||||
|
assertFalse(embedder.writeInbound(new DefaultHttpContent(Unpooled.copiedBuffer(new byte[8]))));
|
||||||
|
|
||||||
|
// Now start a new message and ensure we will not reject it again.
|
||||||
|
HttpRequest message2 = new DefaultHttpRequest(HttpVersion.HTTP_1_0, HttpMethod.PUT, "http://localhost");
|
||||||
|
HttpUtil.setContentLength(message, 2);
|
||||||
|
|
||||||
|
assertFalse(embedder.writeInbound(message2));
|
||||||
|
assertNull(embedder.readOutbound());
|
||||||
|
assertFalse(embedder.writeInbound(new DefaultHttpContent(Unpooled.copiedBuffer(new byte[] { 1 }))));
|
||||||
|
assertNull(embedder.readOutbound());
|
||||||
|
assertTrue(embedder.writeInbound(new DefaultLastHttpContent(Unpooled.copiedBuffer(new byte[] { 2 }))));
|
||||||
|
assertNull(embedder.readOutbound());
|
||||||
|
|
||||||
|
FullHttpRequest request = embedder.readInbound();
|
||||||
|
assertEquals(message2.protocolVersion(), request.protocolVersion());
|
||||||
|
assertEquals(message2.method(), request.method());
|
||||||
|
assertEquals(message2.uri(), request.uri());
|
||||||
|
assertEquals(2, HttpUtil.getContentLength(request));
|
||||||
|
|
||||||
|
byte[] actual = new byte[request.content().readableBytes()];
|
||||||
|
request.content().readBytes(actual);
|
||||||
|
assertArrayEquals(new byte[] { 1, 2 }, actual);
|
||||||
|
request.release();
|
||||||
|
|
||||||
|
assertFalse(embedder.finish());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -399,7 +399,6 @@ public abstract class MessageAggregator<I, S, C extends ByteBufHolder, O extends
|
|||||||
|
|
||||||
private void invokeHandleOversizedMessage(ChannelHandlerContext ctx, S oversized) throws Exception {
|
private void invokeHandleOversizedMessage(ChannelHandlerContext ctx, S oversized) throws Exception {
|
||||||
handlingOversizedMessage = true;
|
handlingOversizedMessage = true;
|
||||||
aggregating = false;
|
|
||||||
currentMessage = null;
|
currentMessage = null;
|
||||||
try {
|
try {
|
||||||
handleOversizedMessage(ctx, oversized);
|
handleOversizedMessage(ctx, oversized);
|
||||||
|
Loading…
Reference in New Issue
Block a user