Fixes #1054 - NPE in Jetty WebSocketListener on PING frame with empty payload
This commit is contained in:
parent
846d560b44
commit
bc67969135
|
@ -21,6 +21,7 @@ package org.eclipse.jetty.websocket.common.frames;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.util.BufferUtil;
|
||||||
import org.eclipse.jetty.websocket.api.ProtocolException;
|
import org.eclipse.jetty.websocket.api.ProtocolException;
|
||||||
import org.eclipse.jetty.websocket.common.WebSocketFrame;
|
import org.eclipse.jetty.websocket.common.WebSocketFrame;
|
||||||
|
|
||||||
|
@ -128,4 +129,14 @@ public abstract class ControlFrame extends WebSocketFrame
|
||||||
}
|
}
|
||||||
return super.setPayload(buf);
|
return super.setPayload(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ByteBuffer getPayload()
|
||||||
|
{
|
||||||
|
if (super.getPayload() == null)
|
||||||
|
{
|
||||||
|
return BufferUtil.EMPTY_BUFFER;
|
||||||
|
}
|
||||||
|
return super.getPayload();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ import org.eclipse.jetty.websocket.api.extensions.Frame;
|
||||||
import org.eclipse.jetty.websocket.common.CloseInfo;
|
import org.eclipse.jetty.websocket.common.CloseInfo;
|
||||||
import org.eclipse.jetty.websocket.common.frames.BinaryFrame;
|
import org.eclipse.jetty.websocket.common.frames.BinaryFrame;
|
||||||
import org.eclipse.jetty.websocket.common.frames.PingFrame;
|
import org.eclipse.jetty.websocket.common.frames.PingFrame;
|
||||||
|
import org.eclipse.jetty.websocket.common.frames.PongFrame;
|
||||||
import org.eclipse.jetty.websocket.common.frames.TextFrame;
|
import org.eclipse.jetty.websocket.common.frames.TextFrame;
|
||||||
import org.eclipse.jetty.websocket.common.io.CloseableLocalWebSocketSession;
|
import org.eclipse.jetty.websocket.common.io.CloseableLocalWebSocketSession;
|
||||||
import org.eclipse.jetty.websocket.common.io.LocalWebSocketSession;
|
import org.eclipse.jetty.websocket.common.io.LocalWebSocketSession;
|
||||||
|
@ -45,6 +46,7 @@ import examples.AnnotatedBinaryStreamSocket;
|
||||||
import examples.AnnotatedFramesSocket;
|
import examples.AnnotatedFramesSocket;
|
||||||
import examples.AnnotatedTextSocket;
|
import examples.AnnotatedTextSocket;
|
||||||
import examples.ListenerBasicSocket;
|
import examples.ListenerBasicSocket;
|
||||||
|
import examples.ListenerPingPongSocket;
|
||||||
|
|
||||||
public class EventDriverTest
|
public class EventDriverTest
|
||||||
{
|
{
|
||||||
|
@ -185,6 +187,50 @@ public class EventDriverTest
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testListenerPingPong() throws Exception
|
||||||
|
{
|
||||||
|
ListenerPingPongSocket socket = new ListenerPingPongSocket();
|
||||||
|
EventDriver driver = wrap(socket);
|
||||||
|
|
||||||
|
try (LocalWebSocketSession conn = new CloseableLocalWebSocketSession(container,testname,driver))
|
||||||
|
{
|
||||||
|
conn.start();
|
||||||
|
conn.open();
|
||||||
|
driver.incomingFrame(new PingFrame().setPayload("PING"));
|
||||||
|
driver.incomingFrame(new PongFrame().setPayload("PONG"));
|
||||||
|
driver.incomingFrame(new CloseInfo(StatusCode.NORMAL).asFrame());
|
||||||
|
|
||||||
|
socket.capture.assertEventCount(4);
|
||||||
|
socket.capture.pop().assertEventStartsWith("onWebSocketConnect");
|
||||||
|
socket.capture.pop().assertEventStartsWith("onWebSocketPing(");
|
||||||
|
socket.capture.pop().assertEventStartsWith("onWebSocketPong(");
|
||||||
|
socket.capture.pop().assertEventStartsWith("onWebSocketClose(1000,");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testListenerEmptyPingPong() throws Exception
|
||||||
|
{
|
||||||
|
ListenerPingPongSocket socket = new ListenerPingPongSocket();
|
||||||
|
EventDriver driver = wrap(socket);
|
||||||
|
|
||||||
|
try (LocalWebSocketSession conn = new CloseableLocalWebSocketSession(container,testname,driver))
|
||||||
|
{
|
||||||
|
conn.start();
|
||||||
|
conn.open();
|
||||||
|
driver.incomingFrame(new PingFrame());
|
||||||
|
driver.incomingFrame(new PongFrame());
|
||||||
|
driver.incomingFrame(new CloseInfo(StatusCode.NORMAL).asFrame());
|
||||||
|
|
||||||
|
socket.capture.assertEventCount(4);
|
||||||
|
socket.capture.pop().assertEventStartsWith("onWebSocketConnect");
|
||||||
|
socket.capture.pop().assertEventStartsWith("onWebSocketPing(");
|
||||||
|
socket.capture.pop().assertEventStartsWith("onWebSocketPong(");
|
||||||
|
socket.capture.pop().assertEventStartsWith("onWebSocketClose(1000,");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private EventDriver wrap(Object websocket)
|
private EventDriver wrap(Object websocket)
|
||||||
{
|
{
|
||||||
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
||||||
|
|
Loading…
Reference in New Issue