Skip to content

Commit f114b40

Browse files
committed
[java] Adding WebSocket support to the Netty-based client
1 parent 1d4be7a commit f114b40

File tree

1 file changed

+43
-4
lines changed

1 file changed

+43
-4
lines changed

java/client/src/org/openqa/selenium/remote/http/netty/NettyWebSocket.java

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
package org.openqa.selenium.remote.http.netty;
1919

2020
import org.asynchttpclient.AsyncHttpClient;
21+
import org.asynchttpclient.ws.WebSocketListener;
22+
import org.asynchttpclient.ws.WebSocketUpgradeHandler;
2123
import org.openqa.selenium.remote.http.ClientConfig;
2224
import org.openqa.selenium.remote.http.Filter;
2325
import org.openqa.selenium.remote.http.HttpRequest;
@@ -26,15 +28,50 @@
2628

2729
import java.io.UncheckedIOException;
2830
import java.util.Objects;
31+
import java.util.concurrent.ExecutionException;
2932
import java.util.concurrent.atomic.AtomicReference;
3033
import java.util.function.BiFunction;
3134
import java.util.function.Function;
3235

3336
class NettyWebSocket implements WebSocket {
3437

35-
private NettyWebSocket(AsyncHttpClient client, Listener listener) {
38+
private org.asynchttpclient.ws.WebSocket socket;
39+
40+
private NettyWebSocket(AsyncHttpClient client, org.asynchttpclient.Request request, Listener listener) {
3641
Objects.requireNonNull(client, "HTTP client to use must be set.");
3742
Objects.requireNonNull(listener, "WebSocket listener must be set.");
43+
44+
try {
45+
socket = client.prepareGet(request.toString().replace("http://", "ws://"))
46+
.execute(new WebSocketUpgradeHandler.Builder()
47+
.addWebSocketListener(new WebSocketListener() {
48+
@Override
49+
public void onOpen(org.asynchttpclient.ws.WebSocket websocket) {
50+
51+
}
52+
53+
@Override
54+
public void onClose(org.asynchttpclient.ws.WebSocket websocket, int code, String reason) {
55+
listener.onClose(code, reason);
56+
}
57+
58+
@Override
59+
public void onError(Throwable t) {
60+
listener.onError(t);
61+
}
62+
63+
@Override
64+
public void onTextFrame(String payload, boolean finalFragment, int rsv) {
65+
if (payload != null) {
66+
listener.onText(payload);
67+
}
68+
}
69+
}).build()).get();
70+
} catch (InterruptedException e) {
71+
e.printStackTrace();
72+
} catch (ExecutionException e) {
73+
e.printStackTrace();
74+
}
3875
}
3976

4077
static BiFunction<HttpRequest, Listener, WebSocket> create(ClientConfig config) {
@@ -53,19 +90,21 @@ static BiFunction<HttpRequest, Listener, WebSocket> create(ClientConfig config)
5390
return (req, listener) -> {
5491
HttpRequest filtered = filterRequest.apply(req);
5592

56-
return new NettyWebSocket(client, listener);
93+
org.asynchttpclient.Request nettyReq = NettyMessages.toNettyRequest(config.baseUri(), filtered);
94+
95+
return new NettyWebSocket(client, nettyReq, listener);
5796
};
5897
}
5998

6099
@Override
61100
public WebSocket sendText(CharSequence data) {
62-
//socket.send(data.toString());
101+
socket.sendTextFrame(data.toString());
63102
return this;
64103
}
65104

66105
@Override
67106
public void close() throws UncheckedIOException {
68-
//socket.close(1000, "WebDriver closing socket");
107+
socket.sendCloseFrame(1000, "WebDriver closing socket");
69108
}
70109

71110
@Override

0 commit comments

Comments
 (0)