diff --git a/jetty-websocket/websocket-javax-common/src/main/java/org/eclipse/jetty/websocket/javax/common/JavaxWebSocketFrameHandler.java b/jetty-websocket/websocket-javax-common/src/main/java/org/eclipse/jetty/websocket/javax/common/JavaxWebSocketFrameHandler.java index e93c08bd891a..634e5f26a398 100644 --- a/jetty-websocket/websocket-javax-common/src/main/java/org/eclipse/jetty/websocket/javax/common/JavaxWebSocketFrameHandler.java +++ b/jetty-websocket/websocket-javax-common/src/main/java/org/eclipse/jetty/websocket/javax/common/JavaxWebSocketFrameHandler.java @@ -596,10 +596,11 @@ private void acceptMessage(Frame frame, Callback callback) public void onPing(Frame frame, Callback callback) { - ByteBuffer payload = BufferUtil.copy(frame.getPayload()); - coreSession.sendFrame(new Frame(OpCode.PONG).setPayload(payload), Callback.NOOP, false); - callback.succeeded(); - coreSession.demand(1); + coreSession.sendFrame(new Frame(OpCode.PONG).setPayload(frame.getPayload()), Callback.from(() -> + { + callback.succeeded(); + coreSession.demand(1); + }), false); } public void onPong(Frame frame, Callback callback) diff --git a/jetty-websocket/websocket-jetty-common/src/main/java/org/eclipse/jetty/websocket/common/JettyWebSocketFrameHandler.java b/jetty-websocket/websocket-jetty-common/src/main/java/org/eclipse/jetty/websocket/common/JettyWebSocketFrameHandler.java index b0cd8ecd8e50..c443f18d2add 100644 --- a/jetty-websocket/websocket-jetty-common/src/main/java/org/eclipse/jetty/websocket/common/JettyWebSocketFrameHandler.java +++ b/jetty-websocket/websocket-jetty-common/src/main/java/org/eclipse/jetty/websocket/common/JettyWebSocketFrameHandler.java @@ -365,16 +365,31 @@ private void onPingFrame(Frame frame, Callback callback) { throw new WebSocketException(endpointInstance.getClass().getSimpleName() + " PING method error: " + cause.getMessage(), cause); } + + callback.succeeded(); + demand(); } else { - // Automatically respond - ByteBuffer payload = BufferUtil.copy(frame.getPayload()); - getSession().getRemote().sendPong(payload, WriteCallback.NOOP); + // Automatically respond. + getSession().getRemote().sendPong(frame.getPayload(), new WriteCallback() + { + @Override + public void writeSuccess() + { + callback.succeeded(); + demand(); + } + + @Override + public void writeFailed(Throwable x) + { + // Ignore failures, we might be output closed and receive ping. + callback.succeeded(); + demand(); + } + }); } - - callback.succeeded(); - demand(); } private void onPongFrame(Frame frame, Callback callback)