Skip to content

Commit 43c9fbd

Browse files
jfarcandrlubke
authored andcommitted
Fix timeout issue with WebSocket when the server close the connection
1 parent 2516ba7 commit 43c9fbd

File tree

7 files changed

+47
-9
lines changed

7 files changed

+47
-9
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ private <T> ListenableFuture<T> doConnect(final Request request, final AsyncHand
947947

948948
ChannelFuture channelFuture;
949949
ClientBootstrap bootstrap = request.getUrl().startsWith(WEBSOCKET) ? webSocketBootstrap : (useSSl ? secureBootstrap : plainBootstrap);
950-
bootstrap.setOption("connectTimeoutMillis", config.getConnectionTimeoutInMs());
950+
//bootstrap.setOption("connectTimeoutMillis", config.getConnectionTimeoutInMs());
951951

952952
// Do no enable this with win.
953953
if (System.getProperty("os.name").toLowerCase().indexOf("win") == -1) {
@@ -1039,6 +1039,7 @@ private void finishChannel(final ChannelHandlerContext ctx) {
10391039

10401040
log.debug("Closing Channel {} ", ctx.getChannel());
10411041

1042+
10421043
try {
10431044
ctx.getChannel().close();
10441045
} catch (Throwable t) {
@@ -1284,6 +1285,7 @@ private void abort(NettyResponseFuture<?> future, Throwable t) {
12841285
log.debug("Aborting Future {}\n", future);
12851286
log.debug(t.getMessage(), t);
12861287
}
1288+
12871289
future.abort(t);
12881290
}
12891291

@@ -1342,6 +1344,9 @@ public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws
13421344
}
13431345
}
13441346

1347+
Protocol p = (ctx.getPipeline().get(HttpClientCodec.class) != null ? httpProtocol : webSocketProtocol);
1348+
p.onClose(ctx, e);
1349+
13451350
if (future != null && !future.isDone() && !future.isCancelled()) {
13461351
if (!remotelyClosed(ctx.getChannel(), future)) {
13471352
abort(future, new IOException("Remotely Closed " + ctx.getChannel()));

src/test/java/com/ning/http/client/websocket/AbstractBasicTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ public abstract class AbstractBasicTest extends Server {
3535
public abstract class WebSocketHandler extends HandlerWrapper implements WebSocketFactory.Acceptor {
3636
private final WebSocketFactory _webSocketFactory = new WebSocketFactory(this, 32 * 1024);
3737

38+
public WebSocketHandler(){
39+
_webSocketFactory.setMaxIdleTime(10000);
40+
}
41+
3842
public WebSocketFactory getWebSocketFactory() {
3943
return _webSocketFactory;
4044
}
@@ -83,7 +87,7 @@ protected String getTargetUrl() {
8387

8488
@BeforeClass(alwaysRun = true)
8589
public void setUpGlobal() throws Exception {
86-
port1 = 8080;
90+
port1 = findFreePort();
8791
_connector = new SelectChannelConnector();
8892
_connector.setPort(port1);
8993

src/test/java/com/ning/http/client/websocket/TextMessageTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,36 @@ public void onError(Throwable t) {
9999
assertEquals(text.get(), "OnOpen");
100100
}
101101

102+
@Test(timeOut = 60000)
103+
public void onTimeoutCloseTest() throws Throwable {
104+
AsyncHttpClient c = getAsyncHttpClient(new AsyncHttpClientConfig.Builder().build());
105+
final CountDownLatch latch = new CountDownLatch(1);
106+
final AtomicReference<String> text = new AtomicReference<String>("");
107+
108+
WebSocket websocket = c.prepareGet(getTargetUrl())
109+
.execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener(new WebSocketListener() {
110+
111+
@Override
112+
public void onOpen(com.ning.http.client.websocket.WebSocket websocket) {
113+
}
114+
115+
@Override
116+
public void onClose(com.ning.http.client.websocket.WebSocket websocket) {
117+
text.set("OnClose");
118+
latch.countDown();
119+
}
120+
121+
@Override
122+
public void onError(Throwable t) {
123+
t.printStackTrace();
124+
latch.countDown();
125+
}
126+
}).build()).get();
127+
128+
latch.await();
129+
assertEquals(text.get(), "OnClose");
130+
}
131+
102132
@Test(timeOut = 60000)
103133
public void onClose() throws Throwable {
104134
AsyncHttpClient c = getAsyncHttpClient(new AsyncHttpClientConfig.Builder().build());

src/test/java/com/ning/http/client/websocket/grizzly/GrizzlyByteMessageText.java renamed to src/test/java/com/ning/http/client/websocket/grizzly/GrizzlyByteMessageTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider;
1919
import com.ning.http.client.websocket.ByteMessageTest;
2020

21-
public class GrizzlyByteMessageText extends ByteMessageTest {
21+
public class GrizzlyByteMessageTest extends ByteMessageTest {
2222
@Override
2323
public AsyncHttpClient getAsyncHttpClient(AsyncHttpClientConfig config) {
2424
if (config == null) {

src/test/java/com/ning/http/client/websocket/grizzly/GrizzlyTextMessageText.java renamed to src/test/java/com/ning/http/client/websocket/grizzly/GrizzlyTextMessageTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider;
1919
import com.ning.http.client.websocket.ByteMessageTest;
2020

21-
public class GrizzlyTextMessageText extends ByteMessageTest {
21+
public class GrizzlyTextMessageTest extends ByteMessageTest {
2222
@Override
2323
public AsyncHttpClient getAsyncHttpClient(AsyncHttpClientConfig config) {
2424
if (config == null) {

src/test/java/com/ning/http/client/websocket/netty/NettyTextMessageText.java renamed to src/test/java/com/ning/http/client/websocket/netty/NettyByteMessageTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
import com.ning.http.client.AsyncHttpClient;
1616
import com.ning.http.client.AsyncHttpClientConfig;
1717
import com.ning.http.client.async.ProviderUtil;
18-
import com.ning.http.client.websocket.ByteMessageTest;
18+
import com.ning.http.client.websocket.TextMessageTest;
1919

20-
public class NettyTextMessageText extends ByteMessageTest {
20+
public class NettyByteMessageTest extends TextMessageTest {
2121
@Override
2222
public AsyncHttpClient getAsyncHttpClient(AsyncHttpClientConfig config) {
2323
return ProviderUtil.nettyProvider(config);

src/test/java/com/ning/http/client/websocket/netty/NettyByteMessageText.java renamed to src/test/java/com/ning/http/client/websocket/netty/NettyTextMessageTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@
1515
import com.ning.http.client.AsyncHttpClient;
1616
import com.ning.http.client.AsyncHttpClientConfig;
1717
import com.ning.http.client.async.ProviderUtil;
18-
import com.ning.http.client.async.ZeroCopyFileTest;
19-
import com.ning.http.client.websocket.ByteMessageTest;
18+
import com.ning.http.client.websocket.TextMessageTest;
2019

21-
public class NettyByteMessageText extends ByteMessageTest {
20+
public class NettyTextMessageTest extends TextMessageTest {
2221
@Override
2322
public AsyncHttpClient getAsyncHttpClient(AsyncHttpClientConfig config) {
2423
return ProviderUtil.nettyProvider(config);

0 commit comments

Comments
 (0)