Skip to content

Commit 98ed0a4

Browse files
committed
Fix for AsyncHttpClient#46 [ResponseFilter] Must be able to replace AsyncHandler from a ResponseFilter, Fix for AsyncHttpClient#47 [WebSocket] Add support for ResponseFilter
1 parent 5731824 commit 98ed0a4

File tree

1 file changed

+33
-6
lines changed

1 file changed

+33
-6
lines changed

src/main/java/com/ning/http/client/providers/netty/NettyAsyncHttpProvider.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1943,7 +1943,7 @@ public void handle(final ChannelHandlerContext ctx, final MessageEvent e) throws
19431943
}
19441944

19451945
HttpRequest nettyRequest = future.getNettyRequest();
1946-
AsyncHandler<?> handler = future.getAsyncHandler();
1946+
AsyncHandler handler = future.getAsyncHandler();
19471947
Request request = future.getRequest();
19481948
HttpResponse response = null;
19491949
try {
@@ -1964,7 +1964,7 @@ public void handle(final ChannelHandlerContext ctx, final MessageEvent e) throws
19641964
Realm realm = request.getRealm() != null ? request.getRealm() : config.getRealm();
19651965

19661966
HttpResponseStatus status = new ResponseStatus(future.getURI(), response, NettyAsyncHttpProvider.this);
1967-
FilterContext<?> fc = new FilterContext.FilterContextBuilder().asyncHandler(handler).request(request).responseStatus(status).build();
1967+
FilterContext fc = new FilterContext.FilterContextBuilder().asyncHandler(handler).request(request).responseStatus(status).build();
19681968
for (ResponseFilter asyncFilter : config.getResponseFilters()) {
19691969
try {
19701970
fc = asyncFilter.filter(fc);
@@ -1976,6 +1976,10 @@ public void handle(final ChannelHandlerContext ctx, final MessageEvent e) throws
19761976
}
19771977
}
19781978

1979+
// The handler may have been wrapped.
1980+
handler = fc.getAsyncHandler();
1981+
future.setAsyncHandler(handler);
1982+
19791983
// The request has changed
19801984
if (fc.replayRequest()) {
19811985
replayRequest(future, fc, response, ctx);
@@ -2220,20 +2224,43 @@ private final class WebSocketProtocol implements Protocol {
22202224

22212225
@Override
22222226
public void handle(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
2223-
final NettyResponseFuture<?> future = (NettyResponseFuture<?>) ctx.getAttachment();
2224-
NettyResponseFuture<?> nettyResponse = NettyResponseFuture.class.cast(ctx.getAttachment());
2225-
WebSocketUpgradeHandler h = WebSocketUpgradeHandler.class.cast(nettyResponse.getAsyncHandler());
2227+
NettyResponseFuture future = NettyResponseFuture.class.cast(ctx.getAttachment());
2228+
WebSocketUpgradeHandler h = WebSocketUpgradeHandler.class.cast(future.getAsyncHandler());
2229+
Request request = future.getRequest();
22262230

22272231
if (e.getMessage() instanceof HttpResponse) {
22282232
HttpResponse response = (HttpResponse) e.getMessage();
2233+
2234+
HttpResponseStatus s = new ResponseStatus(future.getURI(), response, NettyAsyncHttpProvider.this);
2235+
FilterContext<?> fc = new FilterContext.FilterContextBuilder().asyncHandler(h).request(request).responseStatus(s).build();
2236+
for (ResponseFilter asyncFilter : config.getResponseFilters()) {
2237+
try {
2238+
fc = asyncFilter.filter(fc);
2239+
if (fc == null) {
2240+
throw new NullPointerException("FilterContext is null");
2241+
}
2242+
} catch (FilterException efe) {
2243+
abort(future, efe);
2244+
}
2245+
}
2246+
2247+
// The handler may have been wrapped.
2248+
future.setAsyncHandler(fc.getAsyncHandler());
2249+
2250+
// The request has changed
2251+
if (fc.replayRequest()) {
2252+
replayRequest(future, fc, response, ctx);
2253+
return;
2254+
}
2255+
22292256
final org.jboss.netty.handler.codec.http.HttpResponseStatus status =
22302257
new org.jboss.netty.handler.codec.http.HttpResponseStatus(101, "Web Socket Protocol Handshake");
22312258

22322259
final boolean validStatus = response.getStatus().equals(status);
22332260
final boolean validUpgrade = response.getHeader(HttpHeaders.Names.UPGRADE) != null;
22342261
final boolean validConnection = response.getHeader(HttpHeaders.Names.CONNECTION).equals(HttpHeaders.Values.UPGRADE);
22352262

2236-
HttpResponseStatus s = new ResponseStatus(future.getURI(), response, NettyAsyncHttpProvider.this);
2263+
s = new ResponseStatus(future.getURI(), response, NettyAsyncHttpProvider.this);
22372264
final boolean statusReceived = h.onStatusReceived(s) == STATE.UPGRADE;
22382265

22392266
if (!validStatus || !validUpgrade || !validConnection || !statusReceived) {

0 commit comments

Comments
 (0)