ByteBuffer handling for Jetty WebSocket messages

Closes gh-31182
This commit is contained in:
Rossen Stoyanchev
2023-09-12 10:00:47 +01:00
committed by rstoyanchev
parent f51838b6ba
commit ed172d6269
2 changed files with 238 additions and 31 deletions

View File

@@ -90,11 +90,13 @@ public class JettyWebSocketHandlerAdapter {
@OnWebSocketMessage
public void onWebSocketBinary(ByteBuffer payload, Callback callback) {
BinaryMessage message = new BinaryMessage(payload, true);
BinaryMessage message = new BinaryMessage(copyByteBuffer(payload), true);
try {
this.webSocketHandler.handleMessage(this.wsSession, message);
callback.succeed();
}
catch (Exception ex) {
callback.fail(ex);
ExceptionWebSocketHandlerDecorator.tryCloseWithError(this.wsSession, ex, logger);
}
}
@@ -103,16 +105,24 @@ public class JettyWebSocketHandlerAdapter {
public void onWebSocketFrame(Frame frame, Callback callback) {
if (OpCode.PONG == frame.getOpCode()) {
ByteBuffer payload = frame.getPayload() != null ? frame.getPayload() : EMPTY_PAYLOAD;
PongMessage message = new PongMessage(payload);
PongMessage message = new PongMessage(copyByteBuffer(payload));
try {
this.webSocketHandler.handleMessage(this.wsSession, message);
callback.succeed();
}
catch (Exception ex) {
callback.fail(ex);
ExceptionWebSocketHandlerDecorator.tryCloseWithError(this.wsSession, ex, logger);
}
}
}
private static ByteBuffer copyByteBuffer(ByteBuffer src) {
ByteBuffer dest = ByteBuffer.allocate(src.capacity());
dest.put(0, src, 0, src.remaining());
return dest;
}
@OnWebSocketClose
public void onWebSocketClose(int statusCode, String reason) {
CloseStatus closeStatus = new CloseStatus(statusCode, reason);