Skip to content

Commit 122383b

Browse files
committed
Don't leak connection on websocket redirect
1 parent 51653d8 commit 122383b

File tree

1 file changed

+28
-16
lines changed

1 file changed

+28
-16
lines changed

client/src/main/java/org/asynchttpclient/netty/handler/WebSocketProtocol.java

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.netty.buffer.ByteBuf;
1919
import io.netty.channel.Channel;
2020
import io.netty.handler.codec.http.HttpHeaders;
21+
import io.netty.handler.codec.http.HttpRequest;
2122
import io.netty.handler.codec.http.HttpResponse;
2223
import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame;
2324
import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
@@ -69,30 +70,22 @@ private class UpgradeCallback extends Callback {
6970

7071
private final Channel channel;
7172
private final HttpResponse response;
73+
private final WebSocketUpgradeHandler handler;
74+
private final HttpResponseStatus status;
75+
private final HttpResponseHeaders responseHeaders;
7276

73-
public UpgradeCallback(NettyResponseFuture<?> future, Channel channel, HttpResponse response) {
77+
public UpgradeCallback(NettyResponseFuture<?> future, Channel channel, HttpResponse response, WebSocketUpgradeHandler handler, HttpResponseStatus status, HttpResponseHeaders responseHeaders) {
7478
super(future);
7579
this.channel = channel;
7680
this.response = response;
81+
this.handler = handler;
82+
this.status = status;
83+
this.responseHeaders = responseHeaders;
7784
}
7885

7986
@Override
8087
public void call() throws Exception {
8188

82-
WebSocketUpgradeHandler handler = WebSocketUpgradeHandler.class.cast(future.getAsyncHandler());
83-
Request request = future.getCurrentRequest();
84-
85-
HttpResponseStatus status = new NettyResponseStatus(future.getUri(), config, response, channel);
86-
HttpResponseHeaders responseHeaders = new HttpResponseHeaders(response.headers());
87-
Realm realm = request.getRealm() != null ? request.getRealm() : config.getRealm();
88-
89-
if (exitAfterProcessingFilters(channel, future, handler, status, responseHeaders)) {
90-
return;
91-
}
92-
93-
if (REDIRECT_STATUSES.contains(status.getStatusCode()) && exitAfterHandlingRedirect(channel, future, response, request, response.getStatus().code(), realm))
94-
return;
95-
9689
boolean validStatus = response.getStatus().equals(SWITCHING_PROTOCOLS);
9790
boolean validUpgrade = response.headers().get(HttpHeaders.Names.UPGRADE) != null;
9891
String connection = response.headers().get(HttpHeaders.Names.CONNECTION);
@@ -137,7 +130,26 @@ public void handle(Channel channel, NettyResponseFuture<?> future, Object e) thr
137130

138131
if (e instanceof HttpResponse) {
139132
HttpResponse response = (HttpResponse) e;
140-
Channels.setAttribute(channel, new UpgradeCallback(future, channel, response));
133+
if (logger.isDebugEnabled()) {
134+
HttpRequest httpRequest = future.getNettyRequest().getHttpRequest();
135+
logger.debug("\n\nRequest {}\n\nResponse {}\n", httpRequest, response);
136+
}
137+
138+
WebSocketUpgradeHandler handler = WebSocketUpgradeHandler.class.cast(future.getAsyncHandler());
139+
HttpResponseStatus status = new NettyResponseStatus(future.getUri(), config, response, channel);
140+
HttpResponseHeaders responseHeaders = new HttpResponseHeaders(response.headers());
141+
142+
Request request = future.getCurrentRequest();
143+
Realm realm = request.getRealm() != null ? request.getRealm() : config.getRealm();
144+
145+
if (exitAfterProcessingFilters(channel, future, handler, status, responseHeaders)) {
146+
return;
147+
}
148+
149+
if (REDIRECT_STATUSES.contains(status.getStatusCode()) && exitAfterHandlingRedirect(channel, future, response, request, response.getStatus().code(), realm))
150+
return;
151+
152+
Channels.setAttribute(channel, new UpgradeCallback(future, channel, response, handler, status, responseHeaders));
141153

142154
} else if (e instanceof WebSocketFrame) {
143155

0 commit comments

Comments
 (0)