Skip to content

Commit c2d0ef2

Browse files
author
oliver.ko
committed
[UNDERTOW-2532] Modify it to be thread safe when transmitting text or binary message to websocket session
1 parent a4720e3 commit c2d0ef2

File tree

1 file changed

+30
-25
lines changed

1 file changed

+30
-25
lines changed

websockets-jsr/src/main/java/io/undertow/websockets/jsr/WebSocketSessionRemoteEndpoint.java

+30-25
Original file line numberDiff line numberDiff line change
@@ -276,47 +276,52 @@ public void sendText(final String partialMessage, final boolean isLast) throws I
276276
if (binaryFrameSender != null) {
277277
throw JsrWebSocketMessages.MESSAGES.cannotSendInMiddleOfFragmentedMessage();
278278
}
279-
if (textFrameSender == null) {
280-
textFrameSender = undertowSession.getWebSocketChannel().send(WebSocketFrameType.TEXT);
281-
}
282-
try {
283-
Channels.writeBlocking(textFrameSender, WebSocketUtils.fromUtf8String(partialMessage));
284-
if(isLast) {
285-
textFrameSender.shutdownWrites();
279+
280+
synchronized (this) {
281+
if(textFrameSender == null) {
282+
textFrameSender = undertowSession.getWebSocketChannel().send(WebSocketFrameType.TEXT);
286283
}
287-
Channels.flushBlocking(textFrameSender);
288-
} finally {
289-
if (isLast) {
290-
textFrameSender = null;
284+
try {
285+
Channels.writeBlocking(textFrameSender, WebSocketUtils.fromUtf8String(partialMessage));
286+
if(isLast) {
287+
textFrameSender.shutdownWrites();
288+
}
289+
Channels.flushBlocking(textFrameSender);
290+
} finally {
291+
if(isLast) {
292+
textFrameSender = null;
293+
}
291294
}
292295
}
293-
294296
}
295297

296298
@Override
297299
public void sendBinary(final ByteBuffer partialByte, final boolean isLast) throws IOException {
298-
299300
if(partialByte == null) {
300301
throw JsrWebSocketMessages.MESSAGES.messageInNull();
301302
}
302303
if (textFrameSender != null) {
303304
throw JsrWebSocketMessages.MESSAGES.cannotSendInMiddleOfFragmentedMessage();
304305
}
305-
if (binaryFrameSender == null) {
306-
binaryFrameSender = undertowSession.getWebSocketChannel().send(WebSocketFrameType.BINARY);
307-
}
308-
try {
309-
Channels.writeBlocking(binaryFrameSender, partialByte);
310-
if(isLast) {
311-
binaryFrameSender.shutdownWrites();
306+
307+
synchronized (this) {
308+
if (binaryFrameSender == null) {
309+
binaryFrameSender = undertowSession.getWebSocketChannel().send(WebSocketFrameType.BINARY);
310+
}
311+
try {
312+
Channels.writeBlocking(binaryFrameSender, partialByte);
313+
if (isLast) {
314+
binaryFrameSender.shutdownWrites();
315+
}
316+
Channels.flushBlocking(binaryFrameSender);
312317
}
313-
Channels.flushBlocking(binaryFrameSender);
314-
} finally {
315-
if (isLast) {
316-
binaryFrameSender = null;
318+
finally {
319+
if (isLast) {
320+
binaryFrameSender = null;
321+
}
317322
}
323+
partialByte.clear();
318324
}
319-
partialByte.clear();
320325
}
321326

322327
@Override

0 commit comments

Comments
 (0)