netty-1616: Adding a 'last' check to SpdyHttpEncoder.
This commit is contained in:
parent
60529ac3ee
commit
80f92f90cb
@ -18,6 +18,7 @@ package io.netty.handler.codec.spdy;
|
|||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.handler.codec.MessageToMessageEncoder;
|
import io.netty.handler.codec.MessageToMessageEncoder;
|
||||||
import io.netty.handler.codec.UnsupportedMessageTypeException;
|
import io.netty.handler.codec.UnsupportedMessageTypeException;
|
||||||
|
import io.netty.handler.codec.http.FullHttpMessage;
|
||||||
import io.netty.handler.codec.http.FullHttpRequest;
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
import io.netty.handler.codec.http.HttpContent;
|
import io.netty.handler.codec.http.HttpContent;
|
||||||
import io.netty.handler.codec.http.HttpHeaders;
|
import io.netty.handler.codec.http.HttpHeaders;
|
||||||
@ -141,6 +142,7 @@ public class SpdyHttpEncoder extends MessageToMessageEncoder<HttpObject> {
|
|||||||
protected void encode(ChannelHandlerContext ctx, HttpObject msg, List<Object> out) throws Exception {
|
protected void encode(ChannelHandlerContext ctx, HttpObject msg, List<Object> out) throws Exception {
|
||||||
|
|
||||||
boolean valid = false;
|
boolean valid = false;
|
||||||
|
boolean last = false;
|
||||||
|
|
||||||
if (msg instanceof HttpRequest) {
|
if (msg instanceof HttpRequest) {
|
||||||
|
|
||||||
@ -148,6 +150,7 @@ public class SpdyHttpEncoder extends MessageToMessageEncoder<HttpObject> {
|
|||||||
SpdySynStreamFrame spdySynStreamFrame = createSynStreamFrame(httpRequest);
|
SpdySynStreamFrame spdySynStreamFrame = createSynStreamFrame(httpRequest);
|
||||||
out.add(spdySynStreamFrame);
|
out.add(spdySynStreamFrame);
|
||||||
|
|
||||||
|
last = spdySynStreamFrame.isLast();
|
||||||
valid = true;
|
valid = true;
|
||||||
}
|
}
|
||||||
if (msg instanceof HttpResponse) {
|
if (msg instanceof HttpResponse) {
|
||||||
@ -155,15 +158,17 @@ public class SpdyHttpEncoder extends MessageToMessageEncoder<HttpObject> {
|
|||||||
HttpResponse httpResponse = (HttpResponse) msg;
|
HttpResponse httpResponse = (HttpResponse) msg;
|
||||||
if (httpResponse.headers().contains(SpdyHttpHeaders.Names.ASSOCIATED_TO_STREAM_ID)) {
|
if (httpResponse.headers().contains(SpdyHttpHeaders.Names.ASSOCIATED_TO_STREAM_ID)) {
|
||||||
SpdySynStreamFrame spdySynStreamFrame = createSynStreamFrame(httpResponse);
|
SpdySynStreamFrame spdySynStreamFrame = createSynStreamFrame(httpResponse);
|
||||||
|
last = spdySynStreamFrame.isLast();
|
||||||
out.add(spdySynStreamFrame);
|
out.add(spdySynStreamFrame);
|
||||||
} else {
|
} else {
|
||||||
SpdySynReplyFrame spdySynReplyFrame = createSynReplyFrame(httpResponse);
|
SpdySynReplyFrame spdySynReplyFrame = createSynReplyFrame(httpResponse);
|
||||||
|
last = spdySynReplyFrame.isLast();
|
||||||
out.add(spdySynReplyFrame);
|
out.add(spdySynReplyFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
valid = true;
|
valid = true;
|
||||||
}
|
}
|
||||||
if (msg instanceof HttpContent) {
|
if (msg instanceof HttpContent && !last) {
|
||||||
|
|
||||||
HttpContent chunk = (HttpContent) msg;
|
HttpContent chunk = (HttpContent) msg;
|
||||||
|
|
||||||
@ -255,6 +260,7 @@ public class SpdyHttpEncoder extends MessageToMessageEncoder<HttpObject> {
|
|||||||
spdySynStreamFrame.headers().add(entry.getKey(), entry.getValue());
|
spdySynStreamFrame.headers().add(entry.getKey(), entry.getValue());
|
||||||
}
|
}
|
||||||
currentStreamId = spdySynStreamFrame.getStreamId();
|
currentStreamId = spdySynStreamFrame.getStreamId();
|
||||||
|
spdySynStreamFrame.setLast(isLast(httpMessage));
|
||||||
|
|
||||||
return spdySynStreamFrame;
|
return spdySynStreamFrame;
|
||||||
}
|
}
|
||||||
@ -284,8 +290,25 @@ public class SpdyHttpEncoder extends MessageToMessageEncoder<HttpObject> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
currentStreamId = streamID;
|
currentStreamId = streamID;
|
||||||
spdySynReplyFrame.setLast(false);
|
spdySynReplyFrame.setLast(isLast(httpResponse));
|
||||||
|
|
||||||
return spdySynReplyFrame;
|
return spdySynReplyFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the given HTTP message should be considered as a last SPDY frame.
|
||||||
|
*
|
||||||
|
* @param httpMessage check this HTTP message
|
||||||
|
* @return whether the given HTTP message should generate a <em>last</em> SPDY frame.
|
||||||
|
*/
|
||||||
|
private static boolean isLast(HttpMessage httpMessage) {
|
||||||
|
if (httpMessage instanceof FullHttpMessage) {
|
||||||
|
FullHttpMessage fullMessage = (FullHttpMessage) httpMessage;
|
||||||
|
if (fullMessage.trailingHeaders().isEmpty() && !fullMessage.content().isReadable()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user