Fix test failures introduced by 78d8f05c21
This commit is contained in:
parent
a403da3042
commit
96380e756c
@ -21,7 +21,6 @@ import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.ChannelPipeline;
|
||||
import io.netty.channel.MessageList;
|
||||
import io.netty.handler.codec.DecoderResult;
|
||||
import io.netty.handler.codec.PrematureChannelClosureException;
|
||||
import io.netty.handler.codec.ReplayingDecoder;
|
||||
import io.netty.handler.codec.TooLongFrameException;
|
||||
|
||||
@ -436,11 +435,7 @@ public abstract class HttpObjectDecoder extends ReplayingDecoder<HttpObjectDecod
|
||||
actualContentLength = 0;
|
||||
}
|
||||
|
||||
// Add the last message (and its content) to the output.
|
||||
reset(out);
|
||||
|
||||
// Check if this situation where the connection has been closed before decoding the last message completely
|
||||
// is expected or not. If unexpected, set decoder result as failure.
|
||||
// Check if the closure of the connection signifies the end of the content.
|
||||
boolean prematureClosure;
|
||||
if (isDecodingRequest()) {
|
||||
// The last request did not wait for a response.
|
||||
@ -453,8 +448,12 @@ public abstract class HttpObjectDecoder extends ReplayingDecoder<HttpObjectDecod
|
||||
prematureClosure = expectedContentLength >= 0 && actualContentLength != expectedContentLength;
|
||||
}
|
||||
|
||||
if (prematureClosure) {
|
||||
message.setDecoderResult(DecoderResult.failure(new PrematureChannelClosureException()));
|
||||
if (!prematureClosure) {
|
||||
if (actualContentLength == 0) {
|
||||
out.add(LastHttpContent.EMPTY_LAST_CONTENT);
|
||||
} else {
|
||||
out.add(new DefaultLastHttpContent(content));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ import static org.junit.Assert.*;
|
||||
|
||||
public class HttpResponseDecoderTest {
|
||||
@Test
|
||||
public void testEmptyHeaderAndEmptyContent() {
|
||||
public void testLastResponseWithEmptyHeaderAndEmptyContent() {
|
||||
EmbeddedChannel ch = new EmbeddedChannel(new HttpResponseDecoder());
|
||||
ch.writeInbound(Unpooled.copiedBuffer("HTTP/1.1 200 OK\r\n\r\n", CharsetUtil.US_ASCII));
|
||||
|
||||
@ -41,4 +41,26 @@ public class HttpResponseDecoderTest {
|
||||
|
||||
assertThat(ch.readInbound(), is(nullValue()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLastResponseWithoutContentLengthHeader() {
|
||||
EmbeddedChannel ch = new EmbeddedChannel(new HttpResponseDecoder());
|
||||
ch.writeInbound(Unpooled.copiedBuffer("HTTP/1.1 200 OK\r\n\r\n", CharsetUtil.US_ASCII));
|
||||
|
||||
HttpResponse res = (HttpResponse) ch.readInbound();
|
||||
assertThat(res.getProtocolVersion(), sameInstance(HttpVersion.HTTP_1_1));
|
||||
assertThat(res.getStatus(), is(HttpResponseStatus.OK));
|
||||
assertThat(ch.readInbound(), is(nullValue()));
|
||||
|
||||
ch.writeInbound(Unpooled.wrappedBuffer(new byte[1024]));
|
||||
HttpContent content = (HttpContent) ch.readInbound();
|
||||
assertThat(content.content().readableBytes(), is(1024));
|
||||
|
||||
assertThat(ch.finish(), is(true));
|
||||
|
||||
LastHttpContent lastContent = (LastHttpContent) ch.readInbound();
|
||||
assertThat(lastContent.content().isReadable(), is(false));
|
||||
|
||||
assertThat(ch.readInbound(), is(nullValue()));
|
||||
}
|
||||
}
|
||||
|
@ -184,6 +184,18 @@ public final class MessageList<T> implements Iterable<T> {
|
||||
return elements[index];
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the message on the given index.
|
||||
*/
|
||||
public MessageList<T> set(int index, T value) {
|
||||
checkExclusive(index);
|
||||
if (value == null) {
|
||||
throw new NullPointerException("value");
|
||||
}
|
||||
elements[index] = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the message to this {@link MessageList} and return itself.
|
||||
*/
|
||||
|
@ -280,6 +280,15 @@ public class NioSocketChannel extends AbstractNioByteChannel implements io.netty
|
||||
long expectedWrittenBytes = 0;
|
||||
for (int i = index; i < size; i++) {
|
||||
ByteBuf buf = bufs.get(i);
|
||||
if (!buf.isDirect()) {
|
||||
int readableBytes = buf.readableBytes();
|
||||
ByteBuf directBuf = alloc().directBuffer(readableBytes);
|
||||
directBuf.writeBytes(buf, buf.readerIndex(), readableBytes);
|
||||
buf.release();
|
||||
bufs.set(i, directBuf);
|
||||
buf = directBuf;
|
||||
}
|
||||
|
||||
int count = buf.nioBufferCount();
|
||||
if (count == 1) {
|
||||
if (nioBufferCnt == nioBuffers.length) {
|
||||
|
Loading…
Reference in New Issue
Block a user