diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPolicy.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPolicy.java index 0d2ebc78164..193b55cd3d0 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPolicy.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPolicy.java @@ -30,9 +30,9 @@ public class WebSocketPolicy /** * The maximum allowed payload size (validated in both directions) *

- * Default: 65535 (64K) + * Default: 65536 (64K) */ - private int maxPayloadSize = 65535; + private int maxPayloadSize = 65536; /** * The maximum size of a text message during parsing/generating. @@ -51,9 +51,9 @@ public class WebSocketPolicy /** * Maximum Message Buffer size, which is also the max frame byte size. *

- * Default: 65535 (64 K) + * Default: 65536 (64 K) */ - private int bufferSize = 65535; + private int bufferSize = 65536; /** * The time in ms (milliseconds) that a websocket may be idle before closing. @@ -92,9 +92,9 @@ public class WebSocketPolicy public void assertValidPayloadLength(int payloadLength) { // validate to buffer sizes - if (payloadLength > bufferSize) + if (payloadLength > payloadLength) { - throw new MessageTooLargeException("Requested payload length [" + payloadLength + "] exceeds maximum size [" + bufferSize + "]"); + throw new MessageTooLargeException("Requested payload length [" + payloadLength + "] exceeds maximum size [" + payloadLength + "]"); } } @@ -188,6 +188,10 @@ public class WebSocketPolicy public void setMaxPayloadSize(int maxPayloadSize) { + if (maxPayloadSize < bufferSize) + { + throw new IllegalStateException("Cannot have payload size be smaller than buffer size"); + } this.maxPayloadSize = maxPayloadSize; } diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/parser/FrameParser.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/parser/FrameParser.java index ced5432d46c..a77d823d67e 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/parser/FrameParser.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/parser/FrameParser.java @@ -229,6 +229,13 @@ public class FrameParser } else { + // special case for empty payloads (no more bytes left in buffer) + if (payloadLength == 0) + { + state = State.START; + return true; + } + state = State.PAYLOAD; } @@ -248,6 +255,13 @@ public class FrameParser } else { + // special case for empty payloads (no more bytes left in buffer) + if (payloadLength == 0) + { + state = State.START; + return true; + } + state = State.PAYLOAD; } } @@ -260,6 +274,13 @@ public class FrameParser if (buffer.remaining() >= 4) { buffer.get(m,0,4); + // special case for empty payloads (no more bytes left in buffer) + if (payloadLength == 0) + { + state = State.START; + return true; + } + state = State.PAYLOAD; } else @@ -276,6 +297,13 @@ public class FrameParser getFrame().getMask()[cursor] = b; if (cursor == 0) { + // special case for empty payloads (no more bytes left in buffer) + if (payloadLength == 0) + { + state = State.START; + return true; + } + state = State.PAYLOAD; } break; @@ -310,6 +338,11 @@ public class FrameParser */ public boolean parsePayload(ByteBuffer buffer) { + if (payloadLength == 0) + { + return true; + } + while (buffer.hasRemaining()) { if (payload == null) diff --git a/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/ab/TestABCase1_2.java b/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/ab/TestABCase1_2.java index 32e493b4417..d926bd23f1e 100644 --- a/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/ab/TestABCase1_2.java +++ b/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/ab/TestABCase1_2.java @@ -1,6 +1,6 @@ package org.eclipse.jetty.websocket.ab; -import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.*; import java.nio.ByteBuffer; @@ -542,6 +542,6 @@ public class TestABCase1_2 WebSocketFrame pActual = capture.getFrames().get(0); Assert.assertThat("BinaryFrame.payloadLength",pActual.getPayloadLength(),is(0)); - Assert.assertEquals("BinaryFrame.payload",0,pActual.getPayloadData().length); + Assert.assertNull("BinaryFrame.payload",pActual.getPayloadData()); } }