Skip to content

Commit 8fd050d

Browse files
committed
Try to fix Websocket timing issues
1 parent cc28a1b commit 8fd050d

1 file changed

Lines changed: 33 additions & 31 deletions

File tree

src/main/java/org/javawebstack/httpserver/util/websocket/WebSocketFrame.java

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public WebSocketFrame setPayload(byte[] payload) {
7474
return this;
7575
}
7676

77-
public void write(OutputStream stream) throws IOException {
77+
public synchronized void write(OutputStream stream) throws IOException {
7878
stream.write(flags | opcode);
7979
int lengthByte = payload.length > 125 ? (payload.length > 0xFFFF ? 127 : 126) : payload.length;
8080
stream.write((maskKey != null ? 0b1000_0000 : 0) | lengthByte);
@@ -97,37 +97,39 @@ public void write(OutputStream stream) throws IOException {
9797
}
9898

9999
public static WebSocketFrame read(InputStream stream) throws IOException {
100-
WebSocketFrame frame = new WebSocketFrame();
101-
byte b = safeRead(stream);
102-
frame.flags = (byte) (b & 0xF0);
103-
frame.opcode = (byte) (b & 0x0F);
104-
b = safeRead(stream);
105-
frame.maskKey = ((b & 0xFF) >> 7) == 1 ? new byte[4] : null;
106-
int len = b & 0b0111_1111;
107-
if(len == 126) {
108-
len = safeRead(stream) << 8;
109-
len |= safeRead(stream);
110-
} else if(len == 127) {
111-
len = safeRead(stream) << 24;
112-
len |= safeRead(stream) << 16;
113-
len |= safeRead(stream) << 8;
114-
len |= safeRead(stream);
100+
synchronized (stream) {
101+
WebSocketFrame frame = new WebSocketFrame();
102+
byte b = safeRead(stream);
103+
frame.flags = (byte) (b & 0xF0);
104+
frame.opcode = (byte) (b & 0x0F);
105+
b = safeRead(stream);
106+
frame.maskKey = ((b & 0xFF) >> 7) == 1 ? new byte[4] : null;
107+
int len = b & 0b0111_1111;
108+
if(len == 126) {
109+
len = safeRead(stream) << 8;
110+
len |= safeRead(stream);
111+
} else if(len == 127) {
112+
len = safeRead(stream) << 24;
113+
len |= safeRead(stream) << 16;
114+
len |= safeRead(stream) << 8;
115+
len |= safeRead(stream);
116+
}
117+
if(frame.maskKey != null) {
118+
frame.maskKey[0] = safeRead(stream);
119+
frame.maskKey[1] = safeRead(stream);
120+
frame.maskKey[2] = safeRead(stream);
121+
frame.maskKey[3] = safeRead(stream);
122+
}
123+
frame.payload = new byte[len];
124+
if(frame.maskKey != null) {
125+
for(int i=0; i<len; i++)
126+
frame.payload[i] = (byte) (safeRead(stream) ^ frame.maskKey[i % 4]);
127+
} else {
128+
for(int i=0; i<len; i++)
129+
frame.payload[i] = safeRead(stream);
130+
}
131+
return frame;
115132
}
116-
if(frame.maskKey != null) {
117-
frame.maskKey[0] = safeRead(stream);
118-
frame.maskKey[1] = safeRead(stream);
119-
frame.maskKey[2] = safeRead(stream);
120-
frame.maskKey[3] = safeRead(stream);
121-
}
122-
frame.payload = new byte[len];
123-
if(frame.maskKey != null) {
124-
for(int i=0; i<len; i++)
125-
frame.payload[i] = (byte) (safeRead(stream) ^ frame.maskKey[i % 4]);
126-
} else {
127-
for(int i=0; i<len; i++)
128-
frame.payload[i] = safeRead(stream);
129-
}
130-
return frame;
131133
}
132134

133135
private static byte safeRead(InputStream stream) throws IOException {

0 commit comments

Comments
 (0)