in src/main/java/com/microsoft/azure/proton/transport/ws/impl/WebSocketHandlerImpl.java [173:236]
public WebsocketTuple unwrapBuffer(ByteBuffer srcBuffer) {
WebsocketTuple result = new WebsocketTuple(0, WebSocketMessageType.WEB_SOCKET_MESSAGE_TYPE_UNKNOWN);
if (srcBuffer == null) {
throw new IllegalArgumentException("input parameter is null");
}
WebSocketMessageType retVal = WebSocketMessageType.WEB_SOCKET_MESSAGE_TYPE_UNKNOWN;
if (srcBuffer.remaining() > WebSocketHeader.MIN_HEADER_LENGTH) {
// Read the first byte
byte firstByte = srcBuffer.get();
// Get and check the opcode
byte opcode = (byte) (firstByte & WebSocketHeader.OPCODE_MASK);
// Read the second byte
byte secondByte = srcBuffer.get();
// The MASK bit is never used.
// byte maskBit = (byte) (secondByte & WebSocketHeader.MASKBIT_MASK);
byte payloadLength = (byte) (secondByte & WebSocketHeader.PAYLOAD_MASK);
long finalPayloadLength = -1;
// We want to be explicit about the WebSocket payload length because the RFC specifies these ranges.
if (payloadLength <= WebSocketHeader.PAYLOAD_SHORT_MAX) {
finalPayloadLength = payloadLength;
} else if (payloadLength == WebSocketHeader.PAYLOAD_EXTENDED_16) {
// Check if we have enough bytes to read
try {
//Apply mask to turn into unsigned value
finalPayloadLength = srcBuffer.getShort() & 0xFFFF;
} catch (BufferUnderflowException e) {
retVal = WebSocketMessageType.WEB_SOCKET_MESSAGE_TYPE_HEADER_CHUNK;
}
} else if (payloadLength == WebSocketHeader.PAYLOAD_EXTENDED_64) {
//Check if we have enough bytes to read
try {
finalPayloadLength = srcBuffer.getLong();
} catch (BufferUnderflowException e) {
retVal = WebSocketMessageType.WEB_SOCKET_MESSAGE_TYPE_HEADER_CHUNK;
}
}
if (retVal == WebSocketMessageType.WEB_SOCKET_MESSAGE_TYPE_UNKNOWN) {
if (opcode == WebSocketHeader.OPCODE_BINARY) {
retVal = WebSocketMessageType.WEB_SOCKET_MESSAGE_TYPE_AMQP;
} else if (opcode == WebSocketHeader.OPCODE_PING) {
retVal = WebSocketMessageType.WEB_SOCKET_MESSAGE_TYPE_PING;
} else if (opcode == WebSocketHeader.OPCODE_CLOSE) {
retVal = WebSocketMessageType.WEB_SOCKET_MESSAGE_TYPE_CLOSE;
} else if (opcode == WebSocketHeader.OPCODE_CONTINUATION) {
retVal = WebSocketMessageType.WEB_SOCKET_MESSAGE_TYPE_CHUNK;
} else {
retVal = WebSocketMessageType.WEB_SOCKET_MESSAGE_TYPE_UNKNOWN;
}
}
result.setLength(finalPayloadLength);
result.setType(retVal);
}
return result;
}