Fixing framing issues on gen
This commit is contained in:
parent
4df532a211
commit
ce9e7b7560
|
@ -68,21 +68,19 @@ public abstract class FrameGenerator<T extends BaseFrame>
|
||||||
|
|
||||||
// payload lengths
|
// payload lengths
|
||||||
int payloadLength = frame.getPayloadLength();
|
int payloadLength = frame.getPayloadLength();
|
||||||
if (payloadLength >= 0x7F)
|
if ((payloadLength >= 0x7F) && (payloadLength <= 0xFF_FF))
|
||||||
{
|
|
||||||
// we have a 64 bit length
|
|
||||||
b |= 0x7F;
|
|
||||||
framing.put(b);
|
|
||||||
|
|
||||||
framing.putInt(payloadLength);
|
|
||||||
}
|
|
||||||
else if (payloadLength >= 0x7E)
|
|
||||||
{
|
{
|
||||||
// we have a 16 bit length
|
// we have a 16 bit length
|
||||||
b |= 0x7E;
|
b |= 0x7E;
|
||||||
framing.put(b);
|
framing.put(b); // indicate 2 byte length
|
||||||
|
framing.putShort((short)(payloadLength & 0xFF_FF)); // write 2 byte length
|
||||||
framing.putShort((short)(payloadLength & 0xFFFF));
|
}
|
||||||
|
else if (payloadLength >= 0xFFFF)
|
||||||
|
{
|
||||||
|
// we have a 64 bit length
|
||||||
|
b |= 0x7F;
|
||||||
|
framing.put(b); // indicate 4 byte length
|
||||||
|
framing.putInt(payloadLength); // write 4 byte length
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,7 +4,6 @@ package org.eclipse.jetty.websocket.generator;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
import org.eclipse.jetty.io.StandardByteBufferPool;
|
import org.eclipse.jetty.io.StandardByteBufferPool;
|
||||||
import org.eclipse.jetty.util.BufferUtil;
|
|
||||||
import org.eclipse.jetty.util.StringUtil;
|
import org.eclipse.jetty.util.StringUtil;
|
||||||
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;
|
||||||
|
@ -19,63 +18,11 @@ public class RFC6455ExamplesGeneratorTest
|
||||||
{
|
{
|
||||||
StandardByteBufferPool bufferPool = new StandardByteBufferPool();
|
StandardByteBufferPool bufferPool = new StandardByteBufferPool();
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSingleUnmaskedTextMessage()
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
TextFrame text = new TextFrame("Hello");
|
|
||||||
|
|
||||||
text.setFin(true);
|
|
||||||
|
|
||||||
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
|
|
||||||
|
|
||||||
TextFrameGenerator generator = new TextFrameGenerator(bufferPool,policy);
|
|
||||||
|
|
||||||
ByteBuffer actual = generator.generate(text);
|
|
||||||
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(10);
|
|
||||||
|
|
||||||
expected.put(new byte[]
|
|
||||||
{ (byte)0x81, (byte)0x05, (byte)0x48, (byte)0x65, (byte)0x6c, (byte)0x6c, (byte)0x6f });
|
|
||||||
|
|
||||||
expected.flip();
|
|
||||||
actual.flip();
|
|
||||||
|
|
||||||
ByteBufferAssert.assertEquals("t1 buffers are not equal", expected, actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSingleMaskedTextMessage()
|
|
||||||
{
|
|
||||||
TextFrame text = new TextFrame();
|
|
||||||
text.setPayload("Hello");
|
|
||||||
text.setFin(true);
|
|
||||||
text.setMask(new byte[]
|
|
||||||
{ 0x37, (byte)0xfa, 0x21, 0x3d });
|
|
||||||
|
|
||||||
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
|
||||||
|
|
||||||
TextFrameGenerator gen = new TextFrameGenerator(bufferPool,policy);
|
|
||||||
|
|
||||||
ByteBuffer actual = gen.generate(text);
|
|
||||||
actual.flip(); // make readable
|
|
||||||
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(11);
|
|
||||||
// Raw bytes as found in RFC 6455, Section 5.7 - Examples
|
|
||||||
// A single-frame masked text message
|
|
||||||
expected.put(new byte[]
|
|
||||||
{ (byte)0x81, (byte)0x85, 0x37, (byte)0xfa, 0x21, 0x3d, 0x7f, (byte)0x9f, 0x4d, 0x51, 0x58 });
|
|
||||||
expected.flip(); // make readable
|
|
||||||
|
|
||||||
ByteBufferAssert.assertEquals("masked text buffers are not equal",expected,actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFragmentedUnmaskedTextMessage()
|
public void testFragmentedUnmaskedTextMessage()
|
||||||
{
|
{
|
||||||
|
|
||||||
TextFrame text1 = new TextFrame();
|
TextFrame text1 = new TextFrame();
|
||||||
TextFrame text2 = new TextFrame();
|
TextFrame text2 = new TextFrame();
|
||||||
|
|
||||||
|
@ -110,32 +57,6 @@ public class RFC6455ExamplesGeneratorTest
|
||||||
ByteBufferAssert.assertEquals("t1 buffers are not equal", expected1, actual1);
|
ByteBufferAssert.assertEquals("t1 buffers are not equal", expected1, actual1);
|
||||||
ByteBufferAssert.assertEquals("t2 buffers are not equal", expected2, actual2);
|
ByteBufferAssert.assertEquals("t2 buffers are not equal", expected2, actual2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSingleUnmaskedPingRequest() throws Exception
|
|
||||||
{
|
|
||||||
PingFrame ping = new PingFrame();
|
|
||||||
|
|
||||||
byte msg[] = "Hello".getBytes(StringUtil.__UTF8_CHARSET);
|
|
||||||
ByteBuffer payload = ByteBuffer.allocate(msg.length);
|
|
||||||
payload.put(msg);
|
|
||||||
ping.setPayload(payload);
|
|
||||||
|
|
||||||
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
|
||||||
|
|
||||||
PingFrameGenerator gen = new PingFrameGenerator(bufferPool,policy);
|
|
||||||
ByteBuffer actual = gen.generate(ping);
|
|
||||||
actual.flip(); // make readable
|
|
||||||
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(10);
|
|
||||||
expected.put(new byte[]
|
|
||||||
{ (byte)0x89, (byte)0x05, (byte)0x48, (byte)0x65, (byte)0x6c, (byte)0x6c, (byte)0x6f });
|
|
||||||
expected.flip(); // make readable
|
|
||||||
|
|
||||||
ByteBufferAssert.assertEquals("Ping buffers",expected,actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSingleMaskedPongRequest()
|
public void testSingleMaskedPongRequest()
|
||||||
|
@ -165,6 +86,34 @@ public class RFC6455ExamplesGeneratorTest
|
||||||
ByteBufferAssert.assertEquals("pong buffers are not equal",expected,actual);
|
ByteBufferAssert.assertEquals("pong buffers are not equal",expected,actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSingleMaskedTextMessage()
|
||||||
|
{
|
||||||
|
TextFrame text = new TextFrame();
|
||||||
|
text.setPayload("Hello");
|
||||||
|
text.setFin(true);
|
||||||
|
text.setMask(new byte[]
|
||||||
|
{ 0x37, (byte)0xfa, 0x21, 0x3d });
|
||||||
|
|
||||||
|
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
||||||
|
|
||||||
|
TextFrameGenerator gen = new TextFrameGenerator(bufferPool,policy);
|
||||||
|
|
||||||
|
ByteBuffer actual = gen.generate(text);
|
||||||
|
actual.flip(); // make readable
|
||||||
|
|
||||||
|
ByteBuffer expected = ByteBuffer.allocate(11);
|
||||||
|
// Raw bytes as found in RFC 6455, Section 5.7 - Examples
|
||||||
|
// A single-frame masked text message
|
||||||
|
expected.put(new byte[]
|
||||||
|
{ (byte)0x81, (byte)0x85, 0x37, (byte)0xfa, 0x21, 0x3d, 0x7f, (byte)0x9f, 0x4d, 0x51, 0x58 });
|
||||||
|
expected.flip(); // make readable
|
||||||
|
|
||||||
|
ByteBufferAssert.assertEquals("masked text buffers are not equal",expected,actual);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSingleUnmasked256ByteBinaryMessage()
|
public void testSingleUnmasked256ByteBinaryMessage()
|
||||||
{
|
{
|
||||||
|
@ -173,50 +122,92 @@ public class RFC6455ExamplesGeneratorTest
|
||||||
BinaryFrame binary = new BinaryFrame();
|
BinaryFrame binary = new BinaryFrame();
|
||||||
binary.setFin(true);
|
binary.setFin(true);
|
||||||
ByteBuffer payload = ByteBuffer.allocate(dataSize);
|
ByteBuffer payload = ByteBuffer.allocate(dataSize);
|
||||||
|
|
||||||
for (int i = 0; i < dataSize; i++)
|
for (int i = 0; i < dataSize; i++)
|
||||||
{
|
{
|
||||||
payload.put((byte)0x44);
|
payload.put((byte)0x44);
|
||||||
}
|
}
|
||||||
binary.setPayload(payload);
|
binary.setPayload(payload);
|
||||||
|
|
||||||
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
||||||
BinaryFrameGenerator gen = new BinaryFrameGenerator(bufferPool,policy);
|
BinaryFrameGenerator gen = new BinaryFrameGenerator(bufferPool,policy);
|
||||||
|
|
||||||
ByteBuffer actual = gen.generate(binary);
|
ByteBuffer actual = gen.generate(binary);
|
||||||
|
|
||||||
ByteBuffer expected = ByteBuffer.allocate(dataSize + 10);
|
ByteBuffer expected = ByteBuffer.allocate(dataSize + 10);
|
||||||
// Raw bytes as found in RFC 6455, Section 5.7 - Examples
|
// Raw bytes as found in RFC 6455, Section 5.7 - Examples
|
||||||
// 256 bytes binary message in a single unmasked frame
|
// 256 bytes binary message in a single unmasked frame
|
||||||
expected.put(new byte[]
|
expected.put(new byte[]
|
||||||
{ (byte)0x82, (byte)0x7E, (byte)0x01_00 });
|
{ (byte)0x82, (byte)0x7E });
|
||||||
|
expected.putShort((short)0x01_00);
|
||||||
|
|
||||||
for (int i = 0; i < dataSize; i++)
|
for (int i = 0; i < dataSize; i++)
|
||||||
{
|
{
|
||||||
expected.put((byte)0x44);
|
expected.put((byte)0x44);
|
||||||
}
|
}
|
||||||
|
|
||||||
actual.flip();
|
actual.flip();
|
||||||
expected.flip();
|
expected.flip();
|
||||||
|
|
||||||
System.out.println(binary);
|
|
||||||
|
|
||||||
System.out.println(BufferUtil.toDetailString(expected));
|
|
||||||
System.out.println(BufferUtil.toDetailString(actual));
|
|
||||||
|
|
||||||
for ( int i = 0 ; i < 6; ++i )
|
|
||||||
{
|
|
||||||
System.out.println("a " + Integer.toHexString(actual.get()));
|
|
||||||
System.out.println("e " + Integer.toHexString(expected.get()));
|
|
||||||
|
|
||||||
}
|
// System.out.println(binary);
|
||||||
|
|
||||||
|
|
||||||
//ByteBufferAssert.assertEquals("binary buffers are not equal", expected, actual);
|
|
||||||
|
|
||||||
|
// System.out.println(BufferUtil.toDetailString(expected));
|
||||||
|
// System.out.println(BufferUtil.toDetailString(actual));
|
||||||
|
|
||||||
|
// for (int i = 0; i < 20; ++i)
|
||||||
|
// {
|
||||||
|
// System.out.printf("a [%2d] 0x%02x%n",i,actual.get());
|
||||||
|
// System.out.printf("e [%2d] 0x%02x%n",i,expected.get());
|
||||||
|
// }
|
||||||
|
|
||||||
|
ByteBufferAssert.assertEquals("binary buffers are not equal", expected, actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSingleUnmaskedPingRequest() throws Exception
|
||||||
|
{
|
||||||
|
PingFrame ping = new PingFrame();
|
||||||
|
|
||||||
|
byte msg[] = "Hello".getBytes(StringUtil.__UTF8_CHARSET);
|
||||||
|
ByteBuffer payload = ByteBuffer.allocate(msg.length);
|
||||||
|
payload.put(msg);
|
||||||
|
ping.setPayload(payload);
|
||||||
|
|
||||||
|
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
|
||||||
|
|
||||||
|
PingFrameGenerator gen = new PingFrameGenerator(bufferPool,policy);
|
||||||
|
ByteBuffer actual = gen.generate(ping);
|
||||||
|
actual.flip(); // make readable
|
||||||
|
|
||||||
|
ByteBuffer expected = ByteBuffer.allocate(10);
|
||||||
|
expected.put(new byte[]
|
||||||
|
{ (byte)0x89, (byte)0x05, (byte)0x48, (byte)0x65, (byte)0x6c, (byte)0x6c, (byte)0x6f });
|
||||||
|
expected.flip(); // make readable
|
||||||
|
|
||||||
|
ByteBufferAssert.assertEquals("Ping buffers",expected,actual);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSingleUnmaskedTextMessage()
|
||||||
|
{
|
||||||
|
TextFrame text = new TextFrame("Hello");
|
||||||
|
text.setFin(true);
|
||||||
|
|
||||||
|
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
|
||||||
|
|
||||||
|
TextFrameGenerator generator = new TextFrameGenerator(bufferPool,policy);
|
||||||
|
|
||||||
|
ByteBuffer actual = generator.generate(text);
|
||||||
|
|
||||||
|
ByteBuffer expected = ByteBuffer.allocate(10);
|
||||||
|
|
||||||
|
expected.put(new byte[]
|
||||||
|
{ (byte)0x81, (byte)0x05, (byte)0x48, (byte)0x65, (byte)0x6c, (byte)0x6c, (byte)0x6f });
|
||||||
|
|
||||||
|
expected.flip();
|
||||||
|
actual.flip();
|
||||||
|
|
||||||
|
ByteBufferAssert.assertEquals("t1 buffers are not equal", expected, actual);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue