AggregatedFullHttpMessage.replace should also copy a decoder result

Motivation:

HttpObjectAggregator yields full HTTP messgaes (AggregatedFullHttpMessages) that don't respect decoder result when copied/replaced.

Modifications:

Copy the decoding result over to a new instance produced by AggregatedFullHttpRequest.replace or AggregatedFullHttpResponse.replace .

Result:

DecoderResult is now copied over when an original AggregatedFullHttpMessage is being replaced (i.e., AggregatedFullHttpRequest.replace or AggregatedFullHttpResponse.replace is being called).

New unit tests are passing on this branch but are failing on master.
This commit is contained in:
Vladimir Kostyukov 2017-02-04 15:56:40 -08:00 committed by Norman Maurer
parent b9abd3c9fc
commit 0f9b739508
2 changed files with 39 additions and 0 deletions

View File

@ -404,6 +404,7 @@ public class HttpObjectAggregator
DefaultFullHttpRequest dup = new DefaultFullHttpRequest(protocolVersion(), method(), uri(), content); DefaultFullHttpRequest dup = new DefaultFullHttpRequest(protocolVersion(), method(), uri(), content);
dup.headers().set(headers()); dup.headers().set(headers());
dup.trailingHeaders().set(trailingHeaders()); dup.trailingHeaders().set(trailingHeaders());
dup.setDecoderResult(decoderResult());
return dup; return dup;
} }
@ -502,6 +503,7 @@ public class HttpObjectAggregator
DefaultFullHttpResponse dup = new DefaultFullHttpResponse(getProtocolVersion(), getStatus(), content); DefaultFullHttpResponse dup = new DefaultFullHttpResponse(getProtocolVersion(), getStatus(), content);
dup.headers().set(headers()); dup.headers().set(headers());
dup.trailingHeaders().set(trailingHeaders()); dup.trailingHeaders().set(trailingHeaders());
dup.setDecoderResult(decoderResult());
return dup; return dup;
} }

View File

@ -20,6 +20,7 @@ import io.netty.buffer.CompositeByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.embedded.EmbeddedChannel; import io.netty.channel.embedded.EmbeddedChannel;
import io.netty.handler.codec.DecoderResult;
import io.netty.handler.codec.DecoderResultProvider; import io.netty.handler.codec.DecoderResultProvider;
import io.netty.handler.codec.TooLongFrameException; import io.netty.handler.codec.TooLongFrameException;
import io.netty.util.CharsetUtil; import io.netty.util.CharsetUtil;
@ -417,4 +418,40 @@ public class HttpObjectAggregatorTest {
fullMsg.release(); fullMsg.release();
assertFalse(embedder.finish()); assertFalse(embedder.finish());
} }
@Test
public void testReplaceAggregatedRequest() {
EmbeddedChannel embedder = new EmbeddedChannel(new HttpObjectAggregator(1024 * 1024));
Exception boom = new Exception("boom");
HttpRequest req = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "http://localhost");
req.setDecoderResult(DecoderResult.failure(boom));
assertTrue(embedder.writeInbound(req) && embedder.finish());
FullHttpRequest aggregatedReq = embedder.readInbound();
FullHttpRequest replacedReq = aggregatedReq.replace(Unpooled.EMPTY_BUFFER);
assertEquals(replacedReq.decoderResult(), aggregatedReq.decoderResult());
aggregatedReq.release();
replacedReq.release();
}
@Test
public void testReplaceAggregatedResponse() {
EmbeddedChannel embedder = new EmbeddedChannel(new HttpObjectAggregator(1024 * 1024));
Exception boom = new Exception("boom");
HttpResponse rep = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
rep.setDecoderResult(DecoderResult.failure(boom));
assertTrue(embedder.writeInbound(rep) && embedder.finish());
FullHttpResponse aggregatedRep = embedder.readInbound();
FullHttpResponse replacedRep = aggregatedRep.replace(Unpooled.EMPTY_BUFFER);
assertEquals(replacedRep.decoderResult(), aggregatedRep.decoderResult());
aggregatedRep.release();
replacedRep.release();
}
} }