Skip to content

Commit a02c1b6

Browse files
committed
Optimize WebSocket key generation
Motivation: Current implementation uses Math.random(). Modification: Use ThreadLocalRandom instead. Result: Optimized RNG usage.
1 parent f2e165f commit a02c1b6

File tree

2 files changed

+9
-17
lines changed

2 files changed

+9
-17
lines changed

client/src/main/java/org/asynchttpclient/netty/request/NettyRequestFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import static org.asynchttpclient.util.AuthenticatorUtils.*;
1818
import static org.asynchttpclient.util.HttpUtils.*;
1919
import static org.asynchttpclient.util.MiscUtils.*;
20-
import static org.asynchttpclient.ws.WebSocketUtils.getKey;
20+
import static org.asynchttpclient.ws.WebSocketUtils.getWebSocketKey;
2121
import io.netty.buffer.ByteBuf;
2222
import io.netty.buffer.Unpooled;
2323
import io.netty.handler.codec.http.DefaultFullHttpRequest;
@@ -194,7 +194,7 @@ public NettyRequest newNettyRequest(Request request, boolean forceConnect, Proxy
194194
if (!connect && uri.isWebSocket()) {
195195
headers.set(UPGRADE, HttpHeaderValues.WEBSOCKET)//
196196
.set(CONNECTION, HttpHeaderValues.UPGRADE)//
197-
.set(SEC_WEBSOCKET_KEY, getKey())//
197+
.set(SEC_WEBSOCKET_KEY, getWebSocketKey())//
198198
.set(SEC_WEBSOCKET_VERSION, "13");
199199

200200
if (!headers.contains(ORIGIN)) {

client/src/main/java/org/asynchttpclient/ws/WebSocketUtils.java

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,21 @@
1818

1919
import org.asynchttpclient.util.Base64;
2020

21+
import io.netty.util.internal.ThreadLocalRandom;
22+
2123
public final class WebSocketUtils {
2224
public static final String MAGIC_GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
2325

2426
public static String getWebSocketKey() {
25-
byte[] nonce = createRandomBytes(16);
27+
byte[] nonce = new byte[16];
28+
ThreadLocalRandom random = ThreadLocalRandom.current();
29+
for (int i = 0; i < nonce.length; i++) {
30+
nonce[i] = (byte) random.nextInt(256);
31+
}
2632
return Base64.encode(nonce);
2733
}
2834

2935
public static String getAcceptKey(String key) {
3036
return Base64.encode(pooledSha1MessageDigest().digest((key + MAGIC_GUID).getBytes(US_ASCII)));
3137
}
32-
33-
public static byte[] createRandomBytes(int size) {
34-
byte[] bytes = new byte[size];
35-
36-
for (int i = 0; i < size; i++) {
37-
bytes[i] = (byte) createRandomNumber(0, 255);
38-
}
39-
40-
return bytes;
41-
}
42-
43-
public static int createRandomNumber(int min, int max) {
44-
return (int) (Math.random() * max + min);
45-
}
4638
}

0 commit comments

Comments
 (0)