Merge branch 'jetty-9' of ssh://git.eclipse.org/gitroot/jetty/org.eclipse.jetty.project into jetty-9
This commit is contained in:
commit
a5424e65e3
|
@ -6,9 +6,9 @@ import org.eclipse.jetty.util.log.Log;
|
||||||
import org.eclipse.jetty.util.log.Logger;
|
import org.eclipse.jetty.util.log.Logger;
|
||||||
import org.eclipse.jetty.websocket.api.PolicyViolationException;
|
import org.eclipse.jetty.websocket.api.PolicyViolationException;
|
||||||
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
||||||
|
import org.eclipse.jetty.websocket.protocol.CloseInfo;
|
||||||
import org.eclipse.jetty.websocket.protocol.OpCode;
|
import org.eclipse.jetty.websocket.protocol.OpCode;
|
||||||
import org.eclipse.jetty.websocket.protocol.WebSocketFrame;
|
import org.eclipse.jetty.websocket.protocol.WebSocketFrame;
|
||||||
import org.eclipse.jetty.websocket.util.CloseUtil;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <pre>
|
* <pre>
|
||||||
|
@ -153,7 +153,8 @@ public class FrameGenerator
|
||||||
|
|
||||||
if (frame.getOpCode() == OpCode.CLOSE)
|
if (frame.getOpCode() == OpCode.CLOSE)
|
||||||
{
|
{
|
||||||
CloseUtil.assertValidPayload(frame);
|
// validate the close
|
||||||
|
new CloseInfo(frame.getPayloadData(),true);
|
||||||
}
|
}
|
||||||
// copy payload
|
// copy payload
|
||||||
buffer.put(frame.getPayloadData());
|
buffer.put(frame.getPayloadData());
|
||||||
|
|
|
@ -71,11 +71,21 @@ public class FrameBuilder
|
||||||
return new FrameBuilder(new WebSocketFrame(OpCode.PING));
|
return new FrameBuilder(new WebSocketFrame(OpCode.PING));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static FrameBuilder ping(String message)
|
||||||
|
{
|
||||||
|
return new FrameBuilder(new WebSocketFrame(OpCode.PING)).payload(message.getBytes(StringUtil.__UTF8_CHARSET));
|
||||||
|
}
|
||||||
|
|
||||||
public static FrameBuilder pong()
|
public static FrameBuilder pong()
|
||||||
{
|
{
|
||||||
return new FrameBuilder(new WebSocketFrame(OpCode.PONG));
|
return new FrameBuilder(new WebSocketFrame(OpCode.PONG));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static FrameBuilder pong(String message)
|
||||||
|
{
|
||||||
|
return new FrameBuilder(new WebSocketFrame(OpCode.PONG)).payload(message.getBytes(StringUtil.__UTF8_CHARSET));
|
||||||
|
}
|
||||||
|
|
||||||
public static FrameBuilder text()
|
public static FrameBuilder text()
|
||||||
{
|
{
|
||||||
return new FrameBuilder(new WebSocketFrame(OpCode.TEXT));
|
return new FrameBuilder(new WebSocketFrame(OpCode.TEXT));
|
||||||
|
@ -83,7 +93,7 @@ public class FrameBuilder
|
||||||
|
|
||||||
public static FrameBuilder text(String text)
|
public static FrameBuilder text(String text)
|
||||||
{
|
{
|
||||||
return new FrameBuilder(new WebSocketFrame(OpCode.TEXT)).payload(text.getBytes());
|
return new FrameBuilder(new WebSocketFrame(OpCode.TEXT)).payload(text.getBytes(StringUtil.__UTF8_CHARSET));
|
||||||
}
|
}
|
||||||
|
|
||||||
private WebSocketFrame frame;
|
private WebSocketFrame frame;
|
||||||
|
|
|
@ -12,6 +12,12 @@ public class CloseUtil
|
||||||
public static void assertValidPayload(WebSocketFrame frame)
|
public static void assertValidPayload(WebSocketFrame frame)
|
||||||
{
|
{
|
||||||
byte payload[] = frame.getPayloadData();
|
byte payload[] = frame.getPayloadData();
|
||||||
|
|
||||||
|
if (payload.length < 2)
|
||||||
|
{
|
||||||
|
return; // no status code
|
||||||
|
}
|
||||||
|
|
||||||
int statusCode = getStatusCode(payload);
|
int statusCode = getStatusCode(payload);
|
||||||
|
|
||||||
// Validate value
|
// Validate value
|
||||||
|
@ -43,10 +49,6 @@ public class CloseUtil
|
||||||
|
|
||||||
public static int getStatusCode(byte[] payload)
|
public static int getStatusCode(byte[] payload)
|
||||||
{
|
{
|
||||||
if (payload.length < 2)
|
|
||||||
{
|
|
||||||
return 0; // no status code
|
|
||||||
}
|
|
||||||
|
|
||||||
int statusCode = 0;
|
int statusCode = 0;
|
||||||
ByteBuffer bb = ByteBuffer.wrap(payload);
|
ByteBuffer bb = ByteBuffer.wrap(payload);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package org.eclipse.jetty.websocket.ab;
|
package org.eclipse.jetty.websocket.ab;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.*;
|
import static org.hamcrest.Matchers.is;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
@ -8,10 +8,12 @@ import org.eclipse.jetty.websocket.ByteBufferAssert;
|
||||||
import org.eclipse.jetty.websocket.api.WebSocketBehavior;
|
import org.eclipse.jetty.websocket.api.WebSocketBehavior;
|
||||||
import org.eclipse.jetty.websocket.api.WebSocketException;
|
import org.eclipse.jetty.websocket.api.WebSocketException;
|
||||||
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
||||||
import org.eclipse.jetty.websocket.frames.PingFrame;
|
|
||||||
import org.eclipse.jetty.websocket.generator.Generator;
|
import org.eclipse.jetty.websocket.generator.Generator;
|
||||||
import org.eclipse.jetty.websocket.parser.FrameParseCapture;
|
import org.eclipse.jetty.websocket.parser.FrameParseCapture;
|
||||||
import org.eclipse.jetty.websocket.parser.Parser;
|
import org.eclipse.jetty.websocket.parser.Parser;
|
||||||
|
import org.eclipse.jetty.websocket.protocol.FrameBuilder;
|
||||||
|
import org.eclipse.jetty.websocket.protocol.OpCode;
|
||||||
|
import org.eclipse.jetty.websocket.protocol.WebSocketFrame;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -23,14 +25,14 @@ public class TestABCase2
|
||||||
public void testGenerate125OctetPingCase2_4()
|
public void testGenerate125OctetPingCase2_4()
|
||||||
{
|
{
|
||||||
byte[] bytes = new byte[125];
|
byte[] bytes = new byte[125];
|
||||||
|
|
||||||
for ( int i = 0 ; i < bytes.length ; ++i )
|
for ( int i = 0 ; i < bytes.length ; ++i )
|
||||||
{
|
{
|
||||||
bytes[i] = Integer.valueOf(Integer.toOctalString(i)).byteValue();
|
bytes[i] = Integer.valueOf(Integer.toOctalString(i)).byteValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
PingFrame pingFrame = new PingFrame(bytes);
|
WebSocketFrame pingFrame = FrameBuilder.ping().payload(bytes).asFrame();
|
||||||
|
|
||||||
Generator generator = new Generator(policy);
|
Generator generator = new Generator(policy);
|
||||||
ByteBuffer actual = ByteBuffer.allocate(bytes.length + 32);
|
ByteBuffer actual = ByteBuffer.allocate(bytes.length + 32);
|
||||||
generator.generate(actual, pingFrame);
|
generator.generate(actual, pingFrame);
|
||||||
|
@ -39,26 +41,26 @@ public class TestABCase2
|
||||||
|
|
||||||
expected.put(new byte[]
|
expected.put(new byte[]
|
||||||
{ (byte)0x89 });
|
{ (byte)0x89 });
|
||||||
|
|
||||||
byte b = 0x00; // no masking
|
byte b = 0x00; // no masking
|
||||||
b |= bytes.length & 0x7F;
|
b |= bytes.length & 0x7F;
|
||||||
expected.put(b);
|
expected.put(b);
|
||||||
expected.put(bytes);
|
expected.put(bytes);
|
||||||
|
|
||||||
|
|
||||||
actual.flip();
|
actual.flip();
|
||||||
expected.flip();
|
expected.flip();
|
||||||
|
|
||||||
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGenerateBinaryPingCase2_3()
|
public void testGenerateBinaryPingCase2_3()
|
||||||
{
|
{
|
||||||
byte[] bytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
|
byte[] bytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
|
||||||
|
|
||||||
PingFrame pingFrame = new PingFrame(bytes);
|
WebSocketFrame pingFrame = FrameBuilder.ping().payload(bytes).asFrame();
|
||||||
|
|
||||||
Generator generator = new Generator(policy);
|
Generator generator = new Generator(policy);
|
||||||
ByteBuffer actual = ByteBuffer.allocate(32);
|
ByteBuffer actual = ByteBuffer.allocate(32);
|
||||||
generator.generate(actual, pingFrame);
|
generator.generate(actual, pingFrame);
|
||||||
|
@ -67,25 +69,25 @@ public class TestABCase2
|
||||||
|
|
||||||
expected.put(new byte[]
|
expected.put(new byte[]
|
||||||
{ (byte)0x89 });
|
{ (byte)0x89 });
|
||||||
|
|
||||||
byte b = 0x00; // no masking
|
byte b = 0x00; // no masking
|
||||||
b |= bytes.length & 0x7F;
|
b |= bytes.length & 0x7F;
|
||||||
expected.put(b);
|
expected.put(b);
|
||||||
expected.put(bytes);
|
expected.put(bytes);
|
||||||
|
|
||||||
|
|
||||||
actual.flip();
|
actual.flip();
|
||||||
expected.flip();
|
expected.flip();
|
||||||
|
|
||||||
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGenerateEmptyPingCase2_1()
|
public void testGenerateEmptyPingCase2_1()
|
||||||
{
|
{
|
||||||
PingFrame pingFrame = new PingFrame();
|
WebSocketFrame pingFrame = FrameBuilder.ping().asFrame();
|
||||||
|
|
||||||
|
|
||||||
Generator generator = new Generator(policy);
|
Generator generator = new Generator(policy);
|
||||||
ByteBuffer actual = ByteBuffer.allocate(32);
|
ByteBuffer actual = ByteBuffer.allocate(32);
|
||||||
|
@ -95,21 +97,21 @@ public class TestABCase2
|
||||||
|
|
||||||
expected.put(new byte[]
|
expected.put(new byte[]
|
||||||
{ (byte)0x89, (byte)0x00 });
|
{ (byte)0x89, (byte)0x00 });
|
||||||
|
|
||||||
actual.flip();
|
actual.flip();
|
||||||
expected.flip();
|
expected.flip();
|
||||||
|
|
||||||
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGenerateHelloPingCase2_2()
|
public void testGenerateHelloPingCase2_2()
|
||||||
{
|
{
|
||||||
String message = "Hello, world!";
|
String message = "Hello, world!";
|
||||||
byte[] messageBytes = message.getBytes();
|
byte[] messageBytes = message.getBytes();
|
||||||
|
|
||||||
PingFrame pingFrame = new PingFrame(messageBytes);
|
WebSocketFrame pingFrame = FrameBuilder.text(message).asFrame();
|
||||||
|
|
||||||
Generator generator = new Generator(policy);
|
Generator generator = new Generator(policy);
|
||||||
ByteBuffer actual = ByteBuffer.allocate(32);
|
ByteBuffer actual = ByteBuffer.allocate(32);
|
||||||
generator.generate(actual, pingFrame);
|
generator.generate(actual, pingFrame);
|
||||||
|
@ -118,16 +120,16 @@ public class TestABCase2
|
||||||
|
|
||||||
expected.put(new byte[]
|
expected.put(new byte[]
|
||||||
{ (byte)0x89 });
|
{ (byte)0x89 });
|
||||||
|
|
||||||
byte b = 0x00; // no masking
|
byte b = 0x00; // no masking
|
||||||
b |= messageBytes.length & 0x7F;
|
b |= messageBytes.length & 0x7F;
|
||||||
expected.put(b);
|
expected.put(b);
|
||||||
expected.put(messageBytes);
|
expected.put(messageBytes);
|
||||||
|
|
||||||
|
|
||||||
actual.flip();
|
actual.flip();
|
||||||
expected.flip();
|
expected.flip();
|
||||||
|
|
||||||
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,122 +137,123 @@ public class TestABCase2
|
||||||
public void testGenerateOversizedBinaryPingCase2_5_A()
|
public void testGenerateOversizedBinaryPingCase2_5_A()
|
||||||
{
|
{
|
||||||
byte[] bytes = new byte[126];
|
byte[] bytes = new byte[126];
|
||||||
|
|
||||||
for ( int i = 0 ; i < bytes.length ; ++i )
|
for ( int i = 0 ; i < bytes.length ; ++i )
|
||||||
{
|
{
|
||||||
bytes[i] = 0x00;
|
bytes[i] = 0x00;
|
||||||
}
|
}
|
||||||
|
|
||||||
new PingFrame(bytes);
|
FrameBuilder.ping().payload(bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test( expected=WebSocketException.class )
|
@Test( expected=WebSocketException.class )
|
||||||
public void testGenerateOversizedBinaryPingCase2_5_B()
|
public void testGenerateOversizedBinaryPingCase2_5_B()
|
||||||
{
|
{
|
||||||
byte[] bytes = new byte[126];
|
byte[] bytes = new byte[126];
|
||||||
|
|
||||||
for ( int i = 0 ; i < bytes.length ; ++i )
|
for ( int i = 0 ; i < bytes.length ; ++i )
|
||||||
{
|
{
|
||||||
bytes[i] = 0x00;
|
bytes[i] = 0x00;
|
||||||
}
|
}
|
||||||
|
|
||||||
PingFrame pingFrame = new PingFrame();
|
WebSocketFrame pingFrame = FrameBuilder.ping().payload(bytes).asFrame();
|
||||||
pingFrame.setPayload(ByteBuffer.allocate(bytes.length + 32).put(bytes));
|
|
||||||
|
Generator generator = new Generator(WebSocketPolicy.newServerPolicy());
|
||||||
|
generator.generate(ByteBuffer.allocate(bytes.length + 32),pingFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParse125OctetPingCase2_4()
|
public void testParse125OctetPingCase2_4()
|
||||||
{
|
{
|
||||||
byte[] bytes = new byte[125];
|
byte[] bytes = new byte[125];
|
||||||
|
|
||||||
for ( int i = 0 ; i < bytes.length ; ++i )
|
for ( int i = 0 ; i < bytes.length ; ++i )
|
||||||
{
|
{
|
||||||
bytes[i] = Integer.valueOf(Integer.toOctalString(i)).byteValue();
|
bytes[i] = Integer.valueOf(Integer.toOctalString(i)).byteValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(bytes.length + 32);
|
ByteBuffer expected = ByteBuffer.allocate(bytes.length + 32);
|
||||||
|
|
||||||
expected.put(new byte[]
|
expected.put(new byte[]
|
||||||
{ (byte)0x89 });
|
{ (byte)0x89 });
|
||||||
|
|
||||||
byte b = 0x00; // no masking
|
byte b = 0x00; // no masking
|
||||||
b |= bytes.length & 0x7F;
|
b |= bytes.length & 0x7F;
|
||||||
expected.put(b);
|
expected.put(b);
|
||||||
expected.put(bytes);
|
expected.put(bytes);
|
||||||
|
|
||||||
expected.flip();
|
expected.flip();
|
||||||
|
|
||||||
Parser parser = new Parser(policy);
|
Parser parser = new Parser(policy);
|
||||||
FrameParseCapture capture = new FrameParseCapture();
|
FrameParseCapture capture = new FrameParseCapture();
|
||||||
parser.addListener(capture);
|
parser.addListener(capture);
|
||||||
parser.parse(expected);
|
parser.parse(expected);
|
||||||
|
|
||||||
capture.assertNoErrors();
|
capture.assertNoErrors();
|
||||||
capture.assertHasFrame(PingFrame.class,1);
|
capture.assertHasFrame(OpCode.PING,1);
|
||||||
|
|
||||||
PingFrame pActual = (PingFrame)capture.getFrames().get(0);
|
WebSocketFrame pActual = capture.getFrames().get(0);
|
||||||
Assert.assertThat("PingFrame.payloadLength",pActual.getPayloadLength(),is(bytes.length));
|
Assert.assertThat("PingFrame.payloadLength",pActual.getPayloadLength(),is(bytes.length));
|
||||||
ByteBufferAssert.assertSize("PingFrame.payload",bytes.length,pActual.getPayload());
|
Assert.assertEquals("PingFrame.payload",bytes.length,pActual.getPayloadLength());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseBinaryPingCase2_3()
|
public void testParseBinaryPingCase2_3()
|
||||||
{
|
{
|
||||||
byte[] bytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
|
byte[] bytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
|
||||||
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(32);
|
ByteBuffer expected = ByteBuffer.allocate(32);
|
||||||
|
|
||||||
expected.put(new byte[]
|
expected.put(new byte[]
|
||||||
{ (byte)0x89 });
|
{ (byte)0x89 });
|
||||||
|
|
||||||
byte b = 0x00; // no masking
|
byte b = 0x00; // no masking
|
||||||
b |= bytes.length & 0x7F;
|
b |= bytes.length & 0x7F;
|
||||||
expected.put(b);
|
expected.put(b);
|
||||||
expected.put(bytes);
|
expected.put(bytes);
|
||||||
|
|
||||||
expected.flip();
|
expected.flip();
|
||||||
|
|
||||||
Parser parser = new Parser(policy);
|
Parser parser = new Parser(policy);
|
||||||
FrameParseCapture capture = new FrameParseCapture();
|
FrameParseCapture capture = new FrameParseCapture();
|
||||||
parser.addListener(capture);
|
parser.addListener(capture);
|
||||||
parser.parse(expected);
|
parser.parse(expected);
|
||||||
|
|
||||||
capture.assertNoErrors();
|
capture.assertNoErrors();
|
||||||
capture.assertHasFrame(PingFrame.class,1);
|
capture.assertHasFrame(OpCode.PING,1);
|
||||||
|
|
||||||
PingFrame pActual = (PingFrame)capture.getFrames().get(0);
|
WebSocketFrame pActual = capture.getFrames().get(0);
|
||||||
Assert.assertThat("PingFrame.payloadLength",pActual.getPayloadLength(),is(bytes.length));
|
Assert.assertThat("PingFrame.payloadLength",pActual.getPayloadLength(),is(bytes.length));
|
||||||
ByteBufferAssert.assertSize("PingFrame.payload",bytes.length,pActual.getPayload());
|
Assert.assertEquals("PingFrame.payload",bytes.length,pActual.getPayloadLength());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseEmptyPingCase2_1()
|
public void testParseEmptyPingCase2_1()
|
||||||
{
|
{
|
||||||
ByteBuffer expected = ByteBuffer.allocate(5);
|
ByteBuffer expected = ByteBuffer.allocate(5);
|
||||||
|
|
||||||
expected.put(new byte[]
|
expected.put(new byte[]
|
||||||
{ (byte)0x89, (byte)0x00 });
|
{ (byte)0x89, (byte)0x00 });
|
||||||
|
|
||||||
expected.flip();
|
expected.flip();
|
||||||
|
|
||||||
Parser parser = new Parser(policy);
|
Parser parser = new Parser(policy);
|
||||||
FrameParseCapture capture = new FrameParseCapture();
|
FrameParseCapture capture = new FrameParseCapture();
|
||||||
parser.addListener(capture);
|
parser.addListener(capture);
|
||||||
parser.parse(expected);
|
parser.parse(expected);
|
||||||
|
|
||||||
capture.assertNoErrors();
|
capture.assertNoErrors();
|
||||||
capture.assertHasFrame(PingFrame.class,1);
|
capture.assertHasFrame(OpCode.PING,1);
|
||||||
|
|
||||||
PingFrame pActual = (PingFrame)capture.getFrames().get(0);
|
WebSocketFrame pActual = capture.getFrames().get(0);
|
||||||
Assert.assertThat("PingFrame.payloadLength",pActual.getPayloadLength(),is(0));
|
Assert.assertThat("PingFrame.payloadLength",pActual.getPayloadLength(),is(0));
|
||||||
ByteBufferAssert.assertSize("PingFrame.payload",0,pActual.getPayload());
|
Assert.assertEquals("PingFrame.payload",0,pActual.getPayloadLength());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseHelloPingCase2_2()
|
public void testParseHelloPingCase2_2()
|
||||||
{
|
{
|
||||||
String message = "Hello, world!";
|
String message = "Hello, world!";
|
||||||
byte[] messageBytes = message.getBytes();
|
byte[] messageBytes = message.getBytes();
|
||||||
|
|
||||||
|
@ -258,57 +261,57 @@ public class TestABCase2
|
||||||
|
|
||||||
expected.put(new byte[]
|
expected.put(new byte[]
|
||||||
{ (byte)0x89 });
|
{ (byte)0x89 });
|
||||||
|
|
||||||
byte b = 0x00; // no masking
|
byte b = 0x00; // no masking
|
||||||
b |= messageBytes.length & 0x7F;
|
b |= messageBytes.length & 0x7F;
|
||||||
expected.put(b);
|
expected.put(b);
|
||||||
expected.put(messageBytes);
|
expected.put(messageBytes);
|
||||||
|
|
||||||
expected.flip();
|
expected.flip();
|
||||||
|
|
||||||
Parser parser = new Parser(policy);
|
Parser parser = new Parser(policy);
|
||||||
FrameParseCapture capture = new FrameParseCapture();
|
FrameParseCapture capture = new FrameParseCapture();
|
||||||
parser.addListener(capture);
|
parser.addListener(capture);
|
||||||
parser.parse(expected);
|
parser.parse(expected);
|
||||||
|
|
||||||
capture.assertNoErrors();
|
capture.assertNoErrors();
|
||||||
capture.assertHasFrame(PingFrame.class,1);
|
capture.assertHasFrame(OpCode.PING,1);
|
||||||
|
|
||||||
PingFrame pActual = (PingFrame)capture.getFrames().get(0);
|
WebSocketFrame pActual = capture.getFrames().get(0);
|
||||||
Assert.assertThat("PingFrame.payloadLength",pActual.getPayloadLength(),is(message.length()));
|
Assert.assertThat("PingFrame.payloadLength",pActual.getPayloadLength(),is(message.length()));
|
||||||
ByteBufferAssert.assertSize("PingFrame.payload",message.length(),pActual.getPayload());
|
Assert.assertEquals("PingFrame.payload",message.length(),pActual.getPayloadLength());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseOversizedBinaryPingCase2_5()
|
public void testParseOversizedBinaryPingCase2_5()
|
||||||
{
|
{
|
||||||
byte[] bytes = new byte[126];
|
byte[] bytes = new byte[126];
|
||||||
|
|
||||||
for ( int i = 0 ; i < bytes.length ; ++i )
|
for ( int i = 0 ; i < bytes.length ; ++i )
|
||||||
{
|
{
|
||||||
bytes[i] = 0x00;
|
bytes[i] = 0x00;
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(bytes.length + 32);
|
ByteBuffer expected = ByteBuffer.allocate(bytes.length + 32);
|
||||||
|
|
||||||
expected.put(new byte[]
|
expected.put(new byte[]
|
||||||
{ (byte)0x89 });
|
{ (byte)0x89 });
|
||||||
|
|
||||||
byte b = 0x00; // no masking
|
byte b = 0x00; // no masking
|
||||||
b |= bytes.length & 0x7F;
|
b |= bytes.length & 0x7F;
|
||||||
expected.put(b);
|
expected.put(b);
|
||||||
expected.put(bytes);
|
expected.put(bytes);
|
||||||
|
|
||||||
expected.flip();
|
expected.flip();
|
||||||
|
|
||||||
Parser parser = new Parser(policy);
|
Parser parser = new Parser(policy);
|
||||||
FrameParseCapture capture = new FrameParseCapture();
|
FrameParseCapture capture = new FrameParseCapture();
|
||||||
parser.addListener(capture);
|
parser.addListener(capture);
|
||||||
parser.parse(expected);
|
parser.parse(expected);
|
||||||
|
|
||||||
Assert.assertEquals( "error should be returned for too large of ping payload", 1, capture.getErrorCount(WebSocketException.class)) ;
|
Assert.assertEquals( "error should be returned for too large of ping payload", 1, capture.getErrorCount(WebSocketException.class)) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,81 +1,65 @@
|
||||||
package org.eclipse.jetty.websocket.ab;
|
package org.eclipse.jetty.websocket.ab;
|
||||||
|
|
||||||
import org.eclipse.jetty.websocket.frames.CloseFrame;
|
import java.nio.ByteBuffer;
|
||||||
import org.eclipse.jetty.websocket.frames.PingFrame;
|
import java.util.ArrayList;
|
||||||
import org.eclipse.jetty.websocket.frames.PongFrame;
|
import java.util.Collection;
|
||||||
import org.junit.Test;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.websocket.api.PolicyViolationException;
|
||||||
|
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
||||||
|
import org.eclipse.jetty.websocket.generator.Generator;
|
||||||
|
import org.eclipse.jetty.websocket.protocol.FrameBuilder;
|
||||||
|
import org.eclipse.jetty.websocket.protocol.WebSocketFrame;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.Parameterized;
|
||||||
|
import org.junit.runners.Parameterized.Parameters;
|
||||||
|
|
||||||
|
@RunWith(value = Parameterized.class)
|
||||||
public class TestABCase3
|
public class TestABCase3
|
||||||
{
|
{
|
||||||
@Test( expected=IllegalArgumentException.class )
|
|
||||||
public void testGenerateRSV1PingFrame()
|
@Parameters
|
||||||
|
public static Collection<WebSocketFrame[]> data()
|
||||||
{
|
{
|
||||||
PingFrame pingFrame = new PingFrame();
|
List<WebSocketFrame[]> data = new ArrayList<>();
|
||||||
|
// @formatter:off
|
||||||
pingFrame.setRsv1(true);
|
data.add(new WebSocketFrame[]
|
||||||
|
{ FrameBuilder.ping().rsv1(true).asFrame() });
|
||||||
|
data.add(new WebSocketFrame[]
|
||||||
|
{ FrameBuilder.ping().rsv2(true).asFrame() });
|
||||||
|
data.add(new WebSocketFrame[]
|
||||||
|
{ FrameBuilder.ping().rsv3(true).asFrame() });
|
||||||
|
data.add(new WebSocketFrame[]
|
||||||
|
{ FrameBuilder.pong().rsv1(true).asFrame() });
|
||||||
|
data.add(new WebSocketFrame[]
|
||||||
|
{ FrameBuilder.pong().rsv2(true).asFrame() });
|
||||||
|
data.add(new WebSocketFrame[]
|
||||||
|
{ FrameBuilder.pong().rsv3(true).asFrame() });
|
||||||
|
data.add(new WebSocketFrame[]
|
||||||
|
{ FrameBuilder.close().rsv1(true).asFrame() });
|
||||||
|
data.add(new WebSocketFrame[]
|
||||||
|
{ FrameBuilder.close().rsv2(true).asFrame() });
|
||||||
|
data.add(new WebSocketFrame[]
|
||||||
|
{ FrameBuilder.close().rsv3(true).asFrame() });
|
||||||
|
// @formatter:on
|
||||||
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test( expected=IllegalArgumentException.class )
|
private WebSocketFrame invalidFrame;
|
||||||
public void testGenerateRSV2PingFrame()
|
|
||||||
|
public TestABCase3(WebSocketFrame invalidFrame)
|
||||||
{
|
{
|
||||||
PingFrame pingFrame = new PingFrame();
|
this.invalidFrame = invalidFrame;
|
||||||
|
|
||||||
pingFrame.setRsv2(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test( expected=IllegalArgumentException.class )
|
@Test(expected = PolicyViolationException.class)
|
||||||
public void testGenerateRSV3PingFrame()
|
|
||||||
{
|
|
||||||
PingFrame pingFrame = new PingFrame();
|
|
||||||
|
|
||||||
pingFrame.setRsv3(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test( expected=IllegalArgumentException.class )
|
|
||||||
public void testGenerateRSV1PongFrame()
|
|
||||||
{
|
|
||||||
PongFrame pongFrame = new PongFrame();
|
|
||||||
|
|
||||||
pongFrame.setRsv1(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test( expected=IllegalArgumentException.class )
|
|
||||||
public void testGenerateRSV2PongFrame()
|
|
||||||
{
|
|
||||||
PongFrame pongFrame = new PongFrame();
|
|
||||||
|
|
||||||
pongFrame.setRsv2(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test( expected=IllegalArgumentException.class )
|
|
||||||
public void testGenerateRSV3PongFrame()
|
|
||||||
{
|
|
||||||
PongFrame pongFrame = new PongFrame();
|
|
||||||
|
|
||||||
pongFrame.setRsv3(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test( expected=IllegalArgumentException.class )
|
|
||||||
public void testGenerateRSV1CloseFrame()
|
public void testGenerateRSV1CloseFrame()
|
||||||
{
|
{
|
||||||
CloseFrame closeFrame = new CloseFrame();
|
Generator generator = new Generator(WebSocketPolicy.newServerPolicy());
|
||||||
|
|
||||||
closeFrame.setRsv1(true);
|
generator.generate(ByteBuffer.allocate(32),invalidFrame);
|
||||||
}
|
|
||||||
|
|
||||||
@Test( expected=IllegalArgumentException.class )
|
|
||||||
public void testGenerateRSV2CloseFrame()
|
|
||||||
{
|
|
||||||
CloseFrame closeFrame = new CloseFrame();
|
|
||||||
|
|
||||||
closeFrame.setRsv2(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test( expected=IllegalArgumentException.class )
|
|
||||||
public void testGenerateRSV3CloseFrame()
|
|
||||||
{
|
|
||||||
CloseFrame closeFrame = new CloseFrame();
|
|
||||||
|
|
||||||
closeFrame.setRsv3(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package org.eclipse.jetty.websocket.ab;
|
package org.eclipse.jetty.websocket.ab;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.*;
|
import static org.hamcrest.Matchers.is;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
@ -9,10 +9,12 @@ import org.eclipse.jetty.websocket.api.ProtocolException;
|
||||||
import org.eclipse.jetty.websocket.api.WebSocketBehavior;
|
import org.eclipse.jetty.websocket.api.WebSocketBehavior;
|
||||||
import org.eclipse.jetty.websocket.api.WebSocketException;
|
import org.eclipse.jetty.websocket.api.WebSocketException;
|
||||||
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
||||||
import org.eclipse.jetty.websocket.frames.CloseFrame;
|
|
||||||
import org.eclipse.jetty.websocket.generator.Generator;
|
import org.eclipse.jetty.websocket.generator.Generator;
|
||||||
import org.eclipse.jetty.websocket.parser.FrameParseCapture;
|
import org.eclipse.jetty.websocket.parser.FrameParseCapture;
|
||||||
import org.eclipse.jetty.websocket.parser.Parser;
|
import org.eclipse.jetty.websocket.parser.Parser;
|
||||||
|
import org.eclipse.jetty.websocket.protocol.FrameBuilder;
|
||||||
|
import org.eclipse.jetty.websocket.protocol.OpCode;
|
||||||
|
import org.eclipse.jetty.websocket.protocol.WebSocketFrame;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -20,11 +22,55 @@ public class TestABCase7_3
|
||||||
{
|
{
|
||||||
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
|
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
|
||||||
|
|
||||||
@Test (expected = WebSocketException.class)
|
@Test
|
||||||
public void testGenerate1BytePayloadCloseCase7_3_2()
|
public void testCase7_3_1GenerateEmptyClose()
|
||||||
{
|
{
|
||||||
CloseFrame closeFrame = new CloseFrame();
|
WebSocketFrame closeFrame = FrameBuilder.close().asFrame();
|
||||||
closeFrame.setPayload(new byte[] {0x00});
|
|
||||||
|
Generator generator = new Generator(policy);
|
||||||
|
ByteBuffer actual = ByteBuffer.allocate(32);
|
||||||
|
generator.generate(actual, closeFrame);
|
||||||
|
|
||||||
|
ByteBuffer expected = ByteBuffer.allocate(5);
|
||||||
|
|
||||||
|
expected.put(new byte[]
|
||||||
|
{ (byte)0x88, (byte)0x00 });
|
||||||
|
|
||||||
|
actual.flip();
|
||||||
|
expected.flip();
|
||||||
|
|
||||||
|
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCase7_3_1ParseEmptyClose()
|
||||||
|
{
|
||||||
|
ByteBuffer expected = ByteBuffer.allocate(5);
|
||||||
|
|
||||||
|
expected.put(new byte[]
|
||||||
|
{ (byte)0x88, (byte)0x00 });
|
||||||
|
|
||||||
|
expected.flip();
|
||||||
|
|
||||||
|
Parser parser = new Parser(policy);
|
||||||
|
FrameParseCapture capture = new FrameParseCapture();
|
||||||
|
parser.addListener(capture);
|
||||||
|
parser.parse(expected);
|
||||||
|
|
||||||
|
capture.assertNoErrors();
|
||||||
|
capture.assertHasFrame(OpCode.CLOSE,1);
|
||||||
|
|
||||||
|
WebSocketFrame pActual = capture.getFrames().get(0);
|
||||||
|
Assert.assertThat("CloseFrame.payloadLength",pActual.getPayloadLength(),is(0));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test (expected = WebSocketException.class)
|
||||||
|
public void testCase7_3_2Generate1BytePayloadClose()
|
||||||
|
{
|
||||||
|
WebSocketFrame closeFrame = FrameBuilder.close().payload(new byte[]
|
||||||
|
{ 0x00 }).asFrame();
|
||||||
|
|
||||||
Generator generator = new Generator(policy);
|
Generator generator = new Generator(policy);
|
||||||
ByteBuffer actual = ByteBuffer.allocate(32);
|
ByteBuffer actual = ByteBuffer.allocate(32);
|
||||||
|
@ -32,9 +78,31 @@ public class TestABCase7_3
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGenerateCloseWithStatusCase7_3_3()
|
public void testCase7_3_2Parse1BytePayloadClose()
|
||||||
{
|
{
|
||||||
CloseFrame closeFrame = new CloseFrame(1000);
|
ByteBuffer expected = ByteBuffer.allocate(32);
|
||||||
|
|
||||||
|
expected.put(new byte[]
|
||||||
|
{ (byte)0x88, 0x01, 0x00 });
|
||||||
|
|
||||||
|
expected.flip();
|
||||||
|
|
||||||
|
Parser parser = new Parser(policy);
|
||||||
|
FrameParseCapture capture = new FrameParseCapture();
|
||||||
|
parser.addListener(capture);
|
||||||
|
parser.parse(expected);
|
||||||
|
|
||||||
|
Assert.assertEquals( "error on invalid close payload", 1, capture.getErrorCount(WebSocketException.class)) ;
|
||||||
|
|
||||||
|
WebSocketException known = capture.getErrors().get(0);
|
||||||
|
|
||||||
|
Assert.assertTrue("invalid payload should be in message",known.getMessage().contains("invalid payload length"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCase7_3_3GenerateCloseWithStatus()
|
||||||
|
{
|
||||||
|
WebSocketFrame closeFrame = FrameBuilder.close(1000).asFrame();
|
||||||
|
|
||||||
Generator generator = new Generator(policy);
|
Generator generator = new Generator(policy);
|
||||||
ByteBuffer actual = ByteBuffer.allocate(32);
|
ByteBuffer actual = ByteBuffer.allocate(32);
|
||||||
|
@ -51,9 +119,92 @@ public class TestABCase7_3
|
||||||
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCase7_3_3ParseCloseWithStatus()
|
||||||
|
{
|
||||||
|
ByteBuffer expected = ByteBuffer.allocate(5);
|
||||||
|
|
||||||
|
expected.put(new byte[]
|
||||||
|
{ (byte)0x88, (byte)0x02, 0x03, (byte)0xe8 });
|
||||||
|
|
||||||
|
expected.flip();
|
||||||
|
|
||||||
|
Parser parser = new Parser(policy);
|
||||||
|
FrameParseCapture capture = new FrameParseCapture();
|
||||||
|
parser.addListener(capture);
|
||||||
|
parser.parse(expected);
|
||||||
|
|
||||||
|
capture.assertNoErrors();
|
||||||
|
capture.assertHasFrame(OpCode.CLOSE,1);
|
||||||
|
|
||||||
|
WebSocketFrame pActual = capture.getFrames().get(0);
|
||||||
|
Assert.assertThat("CloseFrame.payloadLength",pActual.getPayloadLength(),is(2));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGenerateCloseWithStatusMaxReasonCase7_3_5()
|
public void testCase7_3_4GenerateCloseWithStatusReason()
|
||||||
|
{
|
||||||
|
String message = "bad cough";
|
||||||
|
byte[] messageBytes = message.getBytes();
|
||||||
|
|
||||||
|
WebSocketFrame closeFrame = FrameBuilder.close(1000,message.toString()).asFrame();
|
||||||
|
|
||||||
|
Generator generator = new Generator(policy);
|
||||||
|
ByteBuffer actual = ByteBuffer.allocate(32);
|
||||||
|
generator.generate(actual, closeFrame);
|
||||||
|
|
||||||
|
ByteBuffer expected = ByteBuffer.allocate(32);
|
||||||
|
|
||||||
|
expected.put(new byte[]
|
||||||
|
{ (byte)0x88 });
|
||||||
|
|
||||||
|
byte b = 0x00; // no masking
|
||||||
|
b |= (message.length() + 2) & 0x7F;
|
||||||
|
expected.put(b);
|
||||||
|
expected.putShort((short)1000);
|
||||||
|
expected.put(messageBytes);
|
||||||
|
|
||||||
|
actual.flip();
|
||||||
|
expected.flip();
|
||||||
|
|
||||||
|
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCase7_3_4ParseCloseWithStatusReason()
|
||||||
|
{
|
||||||
|
String message = "bad cough";
|
||||||
|
byte[] messageBytes = message.getBytes();
|
||||||
|
|
||||||
|
ByteBuffer expected = ByteBuffer.allocate(32);
|
||||||
|
|
||||||
|
expected.put(new byte[]
|
||||||
|
{ (byte)0x88 });
|
||||||
|
byte b = 0x00; // no masking
|
||||||
|
b |= (messageBytes.length + 2) & 0x7F;
|
||||||
|
expected.put(b);
|
||||||
|
expected.putShort((short)1000);
|
||||||
|
expected.put(messageBytes);
|
||||||
|
expected.flip();
|
||||||
|
|
||||||
|
Parser parser = new Parser(policy);
|
||||||
|
FrameParseCapture capture = new FrameParseCapture();
|
||||||
|
parser.addListener(capture);
|
||||||
|
parser.parse(expected);
|
||||||
|
|
||||||
|
capture.assertNoErrors();
|
||||||
|
capture.assertHasFrame(OpCode.CLOSE,1);
|
||||||
|
|
||||||
|
WebSocketFrame pActual = capture.getFrames().get(0);
|
||||||
|
Assert.assertThat("CloseFrame.payloadLength",pActual.getPayloadLength(),is(messageBytes.length + 2));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCase7_3_5GenerateCloseWithStatusMaxReason()
|
||||||
{
|
{
|
||||||
StringBuilder message = new StringBuilder();
|
StringBuilder message = new StringBuilder();
|
||||||
for ( int i = 0 ; i < 123 ; ++i )
|
for ( int i = 0 ; i < 123 ; ++i )
|
||||||
|
@ -63,7 +214,7 @@ public class TestABCase7_3
|
||||||
|
|
||||||
byte[] messageBytes = message.toString().getBytes();
|
byte[] messageBytes = message.toString().getBytes();
|
||||||
|
|
||||||
CloseFrame closeFrame = new CloseFrame(1000, message.toString());
|
WebSocketFrame closeFrame = FrameBuilder.close(1000,message.toString()).asFrame();
|
||||||
|
|
||||||
Generator generator = new Generator(policy);
|
Generator generator = new Generator(policy);
|
||||||
ByteBuffer actual = ByteBuffer.allocate(132);
|
ByteBuffer actual = ByteBuffer.allocate(132);
|
||||||
|
@ -88,120 +239,8 @@ public class TestABCase7_3
|
||||||
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = ProtocolException.class)
|
|
||||||
public void testGenerateCloseWithStatusMaxReasonCase7_3_6()
|
|
||||||
{
|
|
||||||
StringBuilder message = new StringBuilder();
|
|
||||||
for ( int i = 0 ; i < 124 ; ++i )
|
|
||||||
{
|
|
||||||
message.append("*");
|
|
||||||
}
|
|
||||||
|
|
||||||
byte[] messageBytes = message.toString().getBytes();
|
|
||||||
|
|
||||||
CloseFrame closeFrame = new CloseFrame(1000, message.toString());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGenerateCloseWithStatusReasonCase7_3_4()
|
public void testCase7_3_5ParseCloseWithStatusMaxReason()
|
||||||
{
|
|
||||||
String message = "bad cough";
|
|
||||||
byte[] messageBytes = message.getBytes();
|
|
||||||
|
|
||||||
CloseFrame closeFrame = new CloseFrame(1000, message);
|
|
||||||
|
|
||||||
Generator generator = new Generator(policy);
|
|
||||||
ByteBuffer actual = ByteBuffer.allocate(32);
|
|
||||||
generator.generate(actual, closeFrame);
|
|
||||||
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(32);
|
|
||||||
|
|
||||||
expected.put(new byte[]
|
|
||||||
{ (byte)0x88 });
|
|
||||||
|
|
||||||
byte b = 0x00; // no masking
|
|
||||||
b |= (message.length() + 2) & 0x7F;
|
|
||||||
expected.put(b);
|
|
||||||
expected.putShort((short)1000);
|
|
||||||
expected.put(messageBytes);
|
|
||||||
|
|
||||||
actual.flip();
|
|
||||||
expected.flip();
|
|
||||||
|
|
||||||
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testGenerateEmptyCloseCase7_3_1()
|
|
||||||
{
|
|
||||||
CloseFrame closeFrame = new CloseFrame();
|
|
||||||
|
|
||||||
Generator generator = new Generator(policy);
|
|
||||||
ByteBuffer actual = ByteBuffer.allocate(32);
|
|
||||||
generator.generate(actual, closeFrame);
|
|
||||||
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(5);
|
|
||||||
|
|
||||||
expected.put(new byte[]
|
|
||||||
{ (byte)0x88, (byte)0x00 });
|
|
||||||
|
|
||||||
actual.flip();
|
|
||||||
expected.flip();
|
|
||||||
|
|
||||||
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParse1BytePayloadCloseCase7_3_2()
|
|
||||||
{
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(32);
|
|
||||||
|
|
||||||
expected.put(new byte[]
|
|
||||||
{ (byte)0x88, 0x01, 0x00 });
|
|
||||||
|
|
||||||
expected.flip();
|
|
||||||
|
|
||||||
Parser parser = new Parser(policy);
|
|
||||||
FrameParseCapture capture = new FrameParseCapture();
|
|
||||||
parser.addListener(capture);
|
|
||||||
parser.parse(expected);
|
|
||||||
|
|
||||||
Assert.assertEquals( "error on invalid close payload", 1, capture.getErrorCount(WebSocketException.class)) ;
|
|
||||||
|
|
||||||
WebSocketException known = capture.getErrors().get(0);
|
|
||||||
|
|
||||||
Assert.assertTrue("invalid payload should be in message",known.getMessage().contains("invalid payload length"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseCloseWithStatusCase7_3_3()
|
|
||||||
{
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(5);
|
|
||||||
|
|
||||||
expected.put(new byte[]
|
|
||||||
{ (byte)0x88, (byte)0x02, 0x03, (byte)0xe8 });
|
|
||||||
|
|
||||||
expected.flip();
|
|
||||||
|
|
||||||
Parser parser = new Parser(policy);
|
|
||||||
FrameParseCapture capture = new FrameParseCapture();
|
|
||||||
parser.addListener(capture);
|
|
||||||
parser.parse(expected);
|
|
||||||
|
|
||||||
capture.assertNoErrors();
|
|
||||||
capture.assertHasFrame(CloseFrame.class,1);
|
|
||||||
|
|
||||||
CloseFrame pActual = (CloseFrame)capture.getFrames().get(0);
|
|
||||||
Assert.assertThat("CloseFrame.payloadLength",pActual.getPayloadLength(),is(2));
|
|
||||||
ByteBufferAssert.assertSize("CloseFrame.payload",2,pActual.getPayload());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseCloseWithStatusMaxReasonCase7_3_5()
|
|
||||||
{
|
{
|
||||||
StringBuilder message = new StringBuilder();
|
StringBuilder message = new StringBuilder();
|
||||||
for ( int i = 0 ; i < 123 ; ++i )
|
for ( int i = 0 ; i < 123 ; ++i )
|
||||||
|
@ -230,16 +269,33 @@ public class TestABCase7_3
|
||||||
parser.parse(expected);
|
parser.parse(expected);
|
||||||
|
|
||||||
capture.assertNoErrors();
|
capture.assertNoErrors();
|
||||||
capture.assertHasFrame(CloseFrame.class,1);
|
capture.assertHasFrame(OpCode.CLOSE,1);
|
||||||
|
|
||||||
CloseFrame pActual = (CloseFrame)capture.getFrames().get(0);
|
WebSocketFrame pActual = capture.getFrames().get(0);
|
||||||
Assert.assertThat("CloseFrame.payloadLength",pActual.getPayloadLength(),is(125));
|
Assert.assertThat("CloseFrame.payloadLength",pActual.getPayloadLength(),is(125));
|
||||||
ByteBufferAssert.assertSize("CloseFrame.payload", 125,pActual.getPayload());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(expected = ProtocolException.class)
|
||||||
|
public void testCase7_3_6GenerateCloseWithInvalidStatusReason()
|
||||||
|
{
|
||||||
|
StringBuilder message = new StringBuilder();
|
||||||
|
for ( int i = 0 ; i < 124 ; ++i )
|
||||||
|
{
|
||||||
|
message.append("*");
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] messageBytes = message.toString().getBytes();
|
||||||
|
|
||||||
|
WebSocketFrame closeFrame = FrameBuilder.close(1000,message.toString()).asFrame();
|
||||||
|
|
||||||
|
Generator generator = new Generator(policy);
|
||||||
|
ByteBuffer actual = ByteBuffer.allocate(32);
|
||||||
|
generator.generate(actual,closeFrame);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseCloseWithStatusMaxReasonCase7_3_6()
|
public void testCase7_3_6ParseCloseWithStatusMaxReason()
|
||||||
{
|
{
|
||||||
StringBuilder message = new StringBuilder();
|
StringBuilder message = new StringBuilder();
|
||||||
for ( int i = 0 ; i < 124 ; ++i )
|
for ( int i = 0 ; i < 124 ; ++i )
|
||||||
|
@ -273,59 +329,4 @@ public class TestABCase7_3
|
||||||
|
|
||||||
Assert.assertTrue("invalid payload should be in message",known.getMessage().contains("invalid payload length"));
|
Assert.assertTrue("invalid payload should be in message",known.getMessage().contains("invalid payload length"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseCloseWithStatusReasonCase7_3_4()
|
|
||||||
{
|
|
||||||
String message = "bad cough";
|
|
||||||
byte[] messageBytes = message.getBytes();
|
|
||||||
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(32);
|
|
||||||
|
|
||||||
expected.put(new byte[]
|
|
||||||
{ (byte)0x88 });
|
|
||||||
byte b = 0x00; // no masking
|
|
||||||
b |= (messageBytes.length + 2) & 0x7F;
|
|
||||||
expected.put(b);
|
|
||||||
expected.putShort((short)1000);
|
|
||||||
expected.put(messageBytes);
|
|
||||||
expected.flip();
|
|
||||||
|
|
||||||
Parser parser = new Parser(policy);
|
|
||||||
FrameParseCapture capture = new FrameParseCapture();
|
|
||||||
parser.addListener(capture);
|
|
||||||
parser.parse(expected);
|
|
||||||
|
|
||||||
capture.assertNoErrors();
|
|
||||||
capture.assertHasFrame(CloseFrame.class,1);
|
|
||||||
|
|
||||||
CloseFrame pActual = (CloseFrame)capture.getFrames().get(0);
|
|
||||||
Assert.assertThat("CloseFrame.payloadLength",pActual.getPayloadLength(),is(messageBytes.length + 2));
|
|
||||||
ByteBufferAssert.assertSize("CloseFrame.payload",messageBytes.length + 2,pActual.getPayload());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseEmptyCloseCase7_3_1()
|
|
||||||
{
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(5);
|
|
||||||
|
|
||||||
expected.put(new byte[]
|
|
||||||
{ (byte)0x88, (byte)0x00 });
|
|
||||||
|
|
||||||
expected.flip();
|
|
||||||
|
|
||||||
Parser parser = new Parser(policy);
|
|
||||||
FrameParseCapture capture = new FrameParseCapture();
|
|
||||||
parser.addListener(capture);
|
|
||||||
parser.parse(expected);
|
|
||||||
|
|
||||||
capture.assertNoErrors();
|
|
||||||
capture.assertHasFrame(CloseFrame.class,1);
|
|
||||||
|
|
||||||
CloseFrame pActual = (CloseFrame)capture.getFrames().get(0);
|
|
||||||
Assert.assertThat("CloseFrame.payloadLength",pActual.getPayloadLength(),is(0));
|
|
||||||
ByteBufferAssert.assertSize("CloseFrame.payload",0,pActual.getPayload());
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
package org.eclipse.jetty.websocket.generator;
|
|
||||||
|
|
||||||
import junit.framework.Assert;
|
|
||||||
|
|
||||||
import org.eclipse.jetty.websocket.frames.CloseFrame;
|
|
||||||
import org.eclipse.jetty.websocket.protocol.OpCode;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
public class CloseFrameGeneratorTest
|
|
||||||
{
|
|
||||||
@Test
|
|
||||||
public void testGenerator() throws Exception
|
|
||||||
{
|
|
||||||
CloseFrame close = new CloseFrame();
|
|
||||||
|
|
||||||
Assert.assertEquals(OpCode.CLOSE,close.getOpCode());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -3,12 +3,10 @@ package org.eclipse.jetty.websocket.generator;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
import org.eclipse.jetty.util.StringUtil;
|
import org.eclipse.jetty.util.BufferUtil;
|
||||||
import org.eclipse.jetty.websocket.ByteBufferAssert;
|
import org.eclipse.jetty.websocket.ByteBufferAssert;
|
||||||
import org.eclipse.jetty.websocket.api.WebSocketBehavior;
|
import org.eclipse.jetty.websocket.api.WebSocketBehavior;
|
||||||
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
|
||||||
import org.eclipse.jetty.websocket.frames.PingFrame;
|
|
||||||
import org.eclipse.jetty.websocket.frames.PongFrame;
|
|
||||||
import org.eclipse.jetty.websocket.protocol.FrameBuilder;
|
import org.eclipse.jetty.websocket.protocol.FrameBuilder;
|
||||||
import org.eclipse.jetty.websocket.protocol.WebSocketFrame;
|
import org.eclipse.jetty.websocket.protocol.WebSocketFrame;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
@ -54,17 +52,11 @@ public class RFC6455ExamplesGeneratorTest
|
||||||
@Test
|
@Test
|
||||||
public void testSingleMaskedPongRequest()
|
public void testSingleMaskedPongRequest()
|
||||||
{
|
{
|
||||||
PongFrame pong = new PongFrame();
|
WebSocketFrame pong = FrameBuilder.pong("Hello").mask(new byte[]
|
||||||
pong.setMask(new byte[]
|
{ 0x37, (byte)0xfa, 0x21, 0x3d }).asFrame();
|
||||||
{ 0x37, (byte)0xfa, 0x21, 0x3d });
|
|
||||||
|
|
||||||
byte msg[] = "Hello".getBytes(StringUtil.__UTF8_CHARSET);
|
|
||||||
ByteBuffer payload = ByteBuffer.allocate(msg.length);
|
|
||||||
payload.put(msg);
|
|
||||||
pong.setPayload(payload);
|
|
||||||
|
|
||||||
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
||||||
PongFrameGenerator gen = new PongFrameGenerator(policy);
|
Generator gen = new Generator(policy);
|
||||||
|
|
||||||
ByteBuffer actual = ByteBuffer.allocate(32);
|
ByteBuffer actual = ByteBuffer.allocate(32);
|
||||||
gen.generate(actual,pong);
|
gen.generate(actual,pong);
|
||||||
|
@ -118,7 +110,7 @@ public class RFC6455ExamplesGeneratorTest
|
||||||
{
|
{
|
||||||
payload.put((byte)0x44);
|
payload.put((byte)0x44);
|
||||||
}
|
}
|
||||||
binary.setPayload(payload);
|
binary.setPayload(BufferUtil.toArray(payload));
|
||||||
|
|
||||||
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
||||||
Generator gen = new Generator(policy);
|
Generator gen = new Generator(policy);
|
||||||
|
@ -155,7 +147,7 @@ public class RFC6455ExamplesGeneratorTest
|
||||||
{
|
{
|
||||||
payload.put((byte)0x44);
|
payload.put((byte)0x44);
|
||||||
}
|
}
|
||||||
binary.setPayload(payload);
|
binary.setPayload(BufferUtil.toArray(payload));
|
||||||
|
|
||||||
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
||||||
Generator gen = new Generator(policy);
|
Generator gen = new Generator(policy);
|
||||||
|
@ -197,16 +189,11 @@ public class RFC6455ExamplesGeneratorTest
|
||||||
@Test
|
@Test
|
||||||
public void testSingleUnmaskedPingRequest() throws Exception
|
public void testSingleUnmaskedPingRequest() throws Exception
|
||||||
{
|
{
|
||||||
PingFrame ping = new PingFrame();
|
WebSocketFrame ping = FrameBuilder.ping("Hello").asFrame();
|
||||||
|
|
||||||
byte msg[] = "Hello".getBytes(StringUtil.__UTF8_CHARSET);
|
|
||||||
ByteBuffer payload = ByteBuffer.allocate(msg.length);
|
|
||||||
payload.put(msg);
|
|
||||||
ping.setPayload(payload);
|
|
||||||
|
|
||||||
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
||||||
|
|
||||||
PingFrameGenerator gen = new PingFrameGenerator(policy);
|
Generator gen = new Generator(policy);
|
||||||
ByteBuffer actual = ByteBuffer.allocate(32);
|
ByteBuffer actual = ByteBuffer.allocate(32);
|
||||||
gen.generate(actual,ping);
|
gen.generate(actual,ping);
|
||||||
actual.flip(); // make readable
|
actual.flip(); // make readable
|
||||||
|
|
Loading…
Reference in New Issue