use of io.netty.handler.codec.http.LastHttpContent in project netty by netty.
the class Http2ServerDowngrader method encode.
@Override
protected void encode(ChannelHandlerContext ctx, HttpObject obj, List<Object> out) throws Exception {
if (obj instanceof HttpResponse) {
Http2Headers headers = HttpConversionUtil.toHttp2Headers((HttpResponse) obj, validateHeaders);
boolean noMoreFrames = false;
if (obj instanceof FullHttpResponse) {
FullHttpResponse full = (FullHttpResponse) obj;
noMoreFrames = !full.content().isReadable() && full.trailingHeaders().isEmpty();
}
out.add(new DefaultHttp2HeadersFrame(headers, noMoreFrames));
}
if (obj instanceof LastHttpContent) {
LastHttpContent last = (LastHttpContent) obj;
encodeLastContent(last, out);
} else if (obj instanceof HttpContent) {
HttpContent cont = (HttpContent) obj;
out.add(new DefaultHttp2DataFrame(cont.content(), false));
}
ReferenceCountUtil.retain(obj);
}
use of io.netty.handler.codec.http.LastHttpContent in project netty by netty.
the class Http2ServerDowngraderTest method testDowngradeEndData.
@Test
public void testDowngradeEndData() throws Exception {
EmbeddedChannel ch = new EmbeddedChannel(new Http2ServerDowngrader());
ByteBuf hello = Unpooled.copiedBuffer("hello world", CharsetUtil.UTF_8);
assertTrue(ch.writeInbound(new DefaultHttp2DataFrame(hello, true)));
LastHttpContent content = ch.readInbound();
try {
assertThat(content.content().toString(CharsetUtil.UTF_8), is("hello world"));
assertTrue(content.trailingHeaders().isEmpty());
} finally {
content.release();
}
assertThat(ch.readInbound(), is(nullValue()));
assertFalse(ch.finish());
}
use of io.netty.handler.codec.http.LastHttpContent in project netty by netty.
the class Http2ServerDowngraderTest method testDowngradeData.
@Test
public void testDowngradeData() throws Exception {
EmbeddedChannel ch = new EmbeddedChannel(new Http2ServerDowngrader());
ByteBuf hello = Unpooled.copiedBuffer("hello world", CharsetUtil.UTF_8);
assertTrue(ch.writeInbound(new DefaultHttp2DataFrame(hello)));
HttpContent content = ch.readInbound();
try {
assertThat(content.content().toString(CharsetUtil.UTF_8), is("hello world"));
assertFalse(content instanceof LastHttpContent);
} finally {
content.release();
}
assertThat(ch.readInbound(), is(nullValue()));
assertFalse(ch.finish());
}
use of io.netty.handler.codec.http.LastHttpContent in project ambry by linkedin.
the class ChannelWriteCallback method noResponseBodyTest.
/**
* Checks the case where no body needs to be returned but just a
* {@link RestResponseChannel#onResponseComplete(Exception)} is called on the server. This should return just
* response metadata.
*/
@Test
public void noResponseBodyTest() {
EmbeddedChannel channel = createEmbeddedChannel();
// with Transfer-Encoding:Chunked
HttpRequest httpRequest = RestTestUtils.createRequest(HttpMethod.GET, TestingUri.ImmediateResponseComplete.toString(), null);
channel.writeInbound(httpRequest);
// There should be a response.
HttpResponse response = (HttpResponse) channel.readOutbound();
assertEquals("Unexpected response status", HttpResponseStatus.OK, response.status());
assertTrue("Response must say 'Transfer-Encoding : chunked'", HttpUtil.isTransferEncodingChunked(response));
// since this is Transfer-Encoding:chunked, there should be a LastHttpContent
assertTrue("Did not receive end marker", channel.readOutbound() instanceof LastHttpContent);
assertTrue("Channel should be alive", channel.isActive());
// with Content-Length set
HttpHeaders headers = new DefaultHttpHeaders();
headers.set(MockNettyMessageProcessor.CHUNK_COUNT_HEADER_NAME, 0);
httpRequest = RestTestUtils.createRequest(HttpMethod.GET, TestingUri.ImmediateResponseComplete.toString(), headers);
HttpUtil.setKeepAlive(httpRequest, false);
channel.writeInbound(httpRequest);
// There should be a response.
response = (HttpResponse) channel.readOutbound();
assertEquals("Response must have Content-Length set to 0", 0, HttpUtil.getContentLength(response, -1));
assertEquals("Unexpected response status", HttpResponseStatus.OK, response.status());
// since Content-Length is set, the response should be an instance of FullHttpResponse.
assertTrue("Response not instance of FullHttpResponse", response instanceof FullHttpResponse);
assertFalse("Channel should not be alive", channel.isActive());
}
use of io.netty.handler.codec.http.LastHttpContent in project ambry by linkedin.
the class ChannelWriteCallback method responsesWithTransferEncodingChunkedTest.
/**
* Tests the common workflow of the {@link NettyResponseChannel} i.e., add some content to response body via
* {@link NettyResponseChannel#write(ByteBuffer, Callback)} and then complete the response.
* <p/>
* These responses have the header Transfer-Encoding set to chunked.
* @throws Exception
*/
@Test
public void responsesWithTransferEncodingChunkedTest() throws Exception {
String content = "@@randomContent@@@";
String lastContent = "@@randomLastContent@@@";
EmbeddedChannel channel = createEmbeddedChannel();
MockNettyMessageProcessor processor = channel.pipeline().get(MockNettyMessageProcessor.class);
AtomicLong contentIdGenerator = new AtomicLong(0);
final int ITERATIONS = 10;
for (int i = 0; i < ITERATIONS; i++) {
boolean isKeepAlive = i != (ITERATIONS - 1);
HttpRequest httpRequest = RestTestUtils.createRequest(HttpMethod.POST, "/", null);
HttpUtil.setKeepAlive(httpRequest, isKeepAlive);
channel.writeInbound(httpRequest);
ArrayList<String> contents = new ArrayList<>();
for (int j = 0; j <= i; j++) {
String contentToSend = content + contentIdGenerator.getAndIncrement();
channel.writeInbound(createContent(contentToSend, false));
contents.add(contentToSend);
}
channel.writeInbound(createContent(lastContent, true));
verifyCallbacks(processor);
// first outbound has to be response.
HttpResponse response = (HttpResponse) channel.readOutbound();
assertEquals("Unexpected response status", HttpResponseStatus.OK, response.status());
assertTrue("Response must say 'Transfer-Encoding : chunked'", HttpUtil.isTransferEncodingChunked(response));
// content echoed back.
for (String srcOfTruth : contents) {
String returnedContent = RestTestUtils.getContentString((HttpContent) channel.readOutbound());
assertEquals("Content does not match with expected content", srcOfTruth, returnedContent);
}
// last content echoed back.
String returnedContent = RestTestUtils.getContentString((HttpContent) channel.readOutbound());
assertEquals("Content does not match with expected content", lastContent, returnedContent);
assertTrue("Did not receive end marker", channel.readOutbound() instanceof LastHttpContent);
assertEquals("Unexpected channel state on the server", isKeepAlive, channel.isActive());
}
}
Aggregations