public WebsocketTuple unwrapBuffer()

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;
    }