Fixed issue: NETTY-359 Missing support for HTTP 'Expect: 100-continue' header.
* Improved the snoop example to support the 100-continue header * Fixed a problem in HttpClientCodec, HTtpContentDecoder and HttpContentEncoder where 100-continue response causes incorrect behavior
This commit is contained in:
parent
04430cd6d3
commit
4fd034ab5d
@ -22,8 +22,8 @@ import static org.jboss.netty.handler.codec.http.HttpVersion.*;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.jboss.netty.buffer.ChannelBuffer;
|
import org.jboss.netty.buffer.ChannelBuffer;
|
||||||
import org.jboss.netty.buffer.ChannelBuffers;
|
import org.jboss.netty.buffer.ChannelBuffers;
|
||||||
@ -62,6 +62,11 @@ public class HttpRequestHandler extends SimpleChannelUpstreamHandler {
|
|||||||
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
|
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
|
||||||
if (!readingChunks) {
|
if (!readingChunks) {
|
||||||
HttpRequest request = this.request = (HttpRequest) e.getMessage();
|
HttpRequest request = this.request = (HttpRequest) e.getMessage();
|
||||||
|
|
||||||
|
if (is100ContinueExpected(request)) {
|
||||||
|
send100Continue(e);
|
||||||
|
}
|
||||||
|
|
||||||
buf.setLength(0);
|
buf.setLength(0);
|
||||||
buf.append("WELCOME TO THE WILD WILD WEB SERVER\r\n");
|
buf.append("WELCOME TO THE WILD WILD WEB SERVER\r\n");
|
||||||
buf.append("===================================\r\n");
|
buf.append("===================================\r\n");
|
||||||
@ -159,6 +164,11 @@ public class HttpRequestHandler extends SimpleChannelUpstreamHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void send100Continue(MessageEvent e) {
|
||||||
|
HttpResponse response = new DefaultHttpResponse(HTTP_1_1, CONTINUE);
|
||||||
|
e.getChannel().write(response);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
|
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
|
@ -116,6 +116,12 @@ public class HttpClientCodec implements ChannelUpstreamHandler,
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isContentAlwaysEmpty(HttpMessage msg) {
|
protected boolean isContentAlwaysEmpty(HttpMessage msg) {
|
||||||
|
final int statusCode = ((HttpResponse) msg).getStatus().getCode();
|
||||||
|
if (statusCode == 100) {
|
||||||
|
// 100-continue response should be excluded from paired comparison.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Get the method of the HTTP request that corresponds to the
|
// Get the method of the HTTP request that corresponds to the
|
||||||
// current response.
|
// current response.
|
||||||
HttpMethod method = queue.poll();
|
HttpMethod method = queue.poll();
|
||||||
@ -137,7 +143,7 @@ public class HttpClientCodec implements ChannelUpstreamHandler,
|
|||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
// Successful CONNECT request results in a response with empty body.
|
// Successful CONNECT request results in a response with empty body.
|
||||||
if (((HttpResponse) msg).getStatus().getCode() == 200) {
|
if (statusCode == 200) {
|
||||||
if (HttpMethod.CONNECT.equals(method)) {
|
if (HttpMethod.CONNECT.equals(method)) {
|
||||||
// Proxy connection established - Not HTTP anymore.
|
// Proxy connection established - Not HTTP anymore.
|
||||||
done = true;
|
done = true;
|
||||||
|
@ -60,7 +60,10 @@ public abstract class HttpContentDecoder extends SimpleChannelUpstreamHandler {
|
|||||||
@Override
|
@Override
|
||||||
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
|
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
|
||||||
Object msg = e.getMessage();
|
Object msg = e.getMessage();
|
||||||
if (msg instanceof HttpMessage) {
|
if (msg instanceof HttpResponse && ((HttpResponse) msg).getStatus().getCode() == 100) {
|
||||||
|
// 100-continue response must be passed through.
|
||||||
|
ctx.sendDownstream(e);
|
||||||
|
} else if (msg instanceof HttpMessage) {
|
||||||
HttpMessage m = (HttpMessage) msg;
|
HttpMessage m = (HttpMessage) msg;
|
||||||
|
|
||||||
decoder = null;
|
decoder = null;
|
||||||
|
@ -88,7 +88,10 @@ public abstract class HttpContentEncoder extends SimpleChannelHandler {
|
|||||||
throws Exception {
|
throws Exception {
|
||||||
|
|
||||||
Object msg = e.getMessage();
|
Object msg = e.getMessage();
|
||||||
if (msg instanceof HttpMessage) {
|
if (msg instanceof HttpResponse && ((HttpResponse) msg).getStatus().getCode() == 100) {
|
||||||
|
// 100-continue response must be passed through.
|
||||||
|
ctx.sendDownstream(e);
|
||||||
|
} else if (msg instanceof HttpMessage) {
|
||||||
HttpMessage m = (HttpMessage) msg;
|
HttpMessage m = (HttpMessage) msg;
|
||||||
|
|
||||||
encoder = null;
|
encoder = null;
|
||||||
|
Loading…
Reference in New Issue
Block a user