annoying hack around close frame logic for parser and generator
This commit is contained in:
parent
deef1a3ac1
commit
65166e6cc6
|
@ -10,7 +10,7 @@ import org.eclipse.jetty.websocket.api.StatusCode;
|
||||||
public class CloseFrame extends ControlFrame
|
public class CloseFrame extends ControlFrame
|
||||||
{
|
{
|
||||||
private int statusCode = 0;
|
private int statusCode = 0;
|
||||||
private String reason;
|
private String reason = "";
|
||||||
|
|
||||||
public CloseFrame()
|
public CloseFrame()
|
||||||
{
|
{
|
||||||
|
@ -53,6 +53,36 @@ public class CloseFrame extends ControlFrame
|
||||||
this.statusCode = statusCode;
|
this.statusCode = statusCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPayloadLength()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* issue here is that the parser can set the payload length and then rely on it when parsing payload
|
||||||
|
*
|
||||||
|
* but generator doesn't have a payload length without calculating it via the statuscode and reason
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
if (super.getPayloadLength() == 0)
|
||||||
|
{
|
||||||
|
int length = 0;
|
||||||
|
if (getStatusCode() != 0)
|
||||||
|
{
|
||||||
|
length = length + 2;
|
||||||
|
|
||||||
|
if (hasReason())
|
||||||
|
{
|
||||||
|
length = length + getReason().getBytes().length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return super.getPayloadLength();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
|
|
|
@ -83,20 +83,12 @@ public class TestABCase7_3
|
||||||
@Test
|
@Test
|
||||||
public void testParse1BytePayloadCloseCase7_3_2()
|
public void testParse1BytePayloadCloseCase7_3_2()
|
||||||
{
|
{
|
||||||
//Debug.enableDebugLogging(Parser.class);
|
Debug.enableDebugLogging(Parser.class);
|
||||||
|
|
||||||
String message = "*";
|
|
||||||
byte[] messageBytes = message.getBytes();
|
|
||||||
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(32);
|
ByteBuffer expected = ByteBuffer.allocate(32);
|
||||||
|
|
||||||
expected.put(new byte[]
|
expected.put(new byte[]
|
||||||
{ (byte)0x88 });
|
{ (byte)0x88, 0x01, 0x00 });
|
||||||
|
|
||||||
byte b = 0x00; // no masking
|
|
||||||
b |= messageBytes.length & 0x7F;
|
|
||||||
expected.put(b);
|
|
||||||
expected.put(messageBytes);
|
|
||||||
|
|
||||||
expected.flip();
|
expected.flip();
|
||||||
|
|
||||||
|
@ -111,4 +103,49 @@ 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 testGenerateCloseWithStatusCase7_3_3()
|
||||||
|
{
|
||||||
|
CloseFrame closeFrame = new CloseFrame(1000);
|
||||||
|
|
||||||
|
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)0x02, 0x03, (byte)0xe8 });
|
||||||
|
|
||||||
|
actual.flip();
|
||||||
|
expected.flip();
|
||||||
|
|
||||||
|
ByteBufferAssert.assertEquals("buffers do not match",expected,actual);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParseCloseWithStatusCase7_3_3()
|
||||||
|
{
|
||||||
|
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());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue