Ejemplo n.º 1
0
        internal static WebSocketFrame ReadFrame(Stream stream, bool unmask)
        {
            WebSocketFrame webSocketFrames = WebSocketFrame.readHeader(stream);

            WebSocketFrame.readExtendedPayloadLength(stream, webSocketFrames);
            WebSocketFrame.readMaskingKey(stream, webSocketFrames);
            WebSocketFrame.readPayloadData(stream, webSocketFrames);
            if (unmask)
            {
                webSocketFrames.Unmask();
            }
            return(webSocketFrames);
        }
Ejemplo n.º 2
0
        private static WebSocketFrame read(byte[] header, Stream stream, bool unmask)
        {
            /* Header */

            // FIN
            var fin = (header[0] & 0x80) == 0x80 ? Fin.Final : Fin.More;
            // RSV1
            var rsv1 = (header[0] & 0x40) == 0x40 ? Rsv.On : Rsv.Off;
            // RSV2
            var rsv2 = (header[0] & 0x20) == 0x20 ? Rsv.On : Rsv.Off;
            // RSV3
            var rsv3 = (header[0] & 0x10) == 0x10 ? Rsv.On : Rsv.Off;
            // Opcode
            var opcode = (Opcode)(header[0] & 0x0f);
            // MASK
            var mask = (header[1] & 0x80) == 0x80 ? Mask.Mask : Mask.Unmask;
            // Payload Length
            var payloadLen = (byte)(header[1] & 0x7f);

            // Check if valid header
            var err = isControl(opcode) && payloadLen > 125
                ? "A control frame has a payload data which is greater than the allowable max size."
                : isControl(opcode) && fin == Fin.More
                  ? "A control frame is fragmented."
                  : !isData(opcode) && rsv1 == Rsv.On
                    ? "A non data frame is compressed."
                    : null;

            if (err != null)
            {
                throw new WebSocketException(CloseStatusCode.ProtocolError, err);
            }

            var frame = new WebSocketFrame();

            frame._fin           = fin;
            frame._rsv1          = rsv1;
            frame._rsv2          = rsv2;
            frame._rsv3          = rsv3;
            frame._opcode        = opcode;
            frame._mask          = mask;
            frame._payloadLength = payloadLen;

            /* Extended Payload Length */

            var size = payloadLen < 126
                 ? 0
                 : payloadLen == 126
                   ? 2
                   : 8;

            var extPayloadLen = size > 0 ? stream.ReadBytes(size) : new byte[0];

            if (size > 0 && extPayloadLen.Length != size)
            {
                throw new WebSocketException(
                          "The 'Extended Payload Length' of a frame cannot be read from the data source.");
            }

            frame._extPayloadLength = extPayloadLen;

            /* Masking Key */

            var masked     = mask == Mask.Mask;
            var maskingKey = masked ? stream.ReadBytes(4) : new byte[0];

            if (masked && maskingKey.Length != 4)
            {
                throw new WebSocketException(
                          "The 'Masking Key' of a frame cannot be read from the data source.");
            }

            frame._maskingKey = maskingKey;

            /* Payload Data */

            ulong len = payloadLen < 126
                  ? payloadLen
                  : payloadLen == 126
                    ? extPayloadLen.ToUInt16(ByteOrder.Big)
                    : extPayloadLen.ToUInt64(ByteOrder.Big);

            byte[] data = null;
            if (len > 0)
            {
                // Check if allowable max length.
                if (payloadLen > 126 && len > PayloadData.MaxLength)
                {
                    throw new WebSocketException(
                              CloseStatusCode.TooBig,
                              "The length of 'Payload Data' of a frame is greater than the allowable max length.");
                }

                data = payloadLen > 126
               ? stream.ReadBytes((long)len, 1024)
               : stream.ReadBytes((int)len);

                if (data.LongLength != (long)len)
                {
                    throw new WebSocketException(
                              "The 'Payload Data' of a frame cannot be read from the data source.");
                }
            }
            else
            {
                data = new byte[0];
            }

            frame._payloadData = new PayloadData(data, masked);
            if (unmask && masked)
            {
                frame.Unmask();
            }

            return(frame);
        }
Ejemplo n.º 3
0
        private static WebSocketFrame read(byte[] header, Stream stream, bool unmask)
        {
            Fin    fin    = (((header[0] & 0x80) == 128) ? Fin.Final : Fin.More);
            Rsv    rsv    = (((header[0] & 0x40) == 64) ? Rsv.On : Rsv.Off);
            Rsv    rsv2   = (((header[0] & 0x20) == 32) ? Rsv.On : Rsv.Off);
            Rsv    rsv3   = (((header[0] & 0x10) == 16) ? Rsv.On : Rsv.Off);
            Opcode opcode = (Opcode)(header[0] & 0xFu);
            Mask   mask   = (((header[1] & 0x80) == 128) ? Mask.Mask : Mask.Unmask);
            byte   b      = (byte)(header[1] & 0x7Fu);
            string text   = ((isControl(opcode) && b > 125) ? "A control frame has a payload data which is greater than the allowable max size." : ((isControl(opcode) && fin == Fin.More) ? "A control frame is fragmented." : ((isData(opcode) || rsv != Rsv.On) ? null : "A non data frame is compressed.")));

            if (text != null)
            {
                throw new WebSocketException(CloseStatusCode.ProtocolError, text);
            }
            WebSocketFrame webSocketFrame = new WebSocketFrame();

            webSocketFrame._fin           = fin;
            webSocketFrame._rsv1          = rsv;
            webSocketFrame._rsv2          = rsv2;
            webSocketFrame._rsv3          = rsv3;
            webSocketFrame._opcode        = opcode;
            webSocketFrame._mask          = mask;
            webSocketFrame._payloadLength = b;
            int num = ((b >= 126) ? ((b != 126) ? 8 : 2) : 0);

            byte[] array = ((num <= 0) ? new byte[0] : stream.ReadBytes(num));
            if (num > 0 && array.Length != num)
            {
                throw new WebSocketException("The 'Extended Payload Length' of a frame cannot be read from the data source.");
            }
            webSocketFrame._extPayloadLength = array;
            bool flag = mask == Mask.Mask;

            byte[] array2 = ((!flag) ? new byte[0] : stream.ReadBytes(4));
            if (flag && array2.Length != 4)
            {
                throw new WebSocketException("The 'Masking Key' of a frame cannot be read from the data source.");
            }
            webSocketFrame._maskingKey = array2;
            ulong num2 = ((b < 126) ? b : ((b != 126) ? array.ToUInt64(ByteOrder.Big) : array.ToUInt16(ByteOrder.Big)));

            byte[] array3 = null;
            if (num2 != 0)
            {
                if (b > 126 && num2 > long.MaxValue)
                {
                    throw new WebSocketException(CloseStatusCode.TooBig, "The length of 'Payload Data' of a frame is greater than the allowable max length.");
                }
                array3 = ((b <= 126) ? stream.ReadBytes((int)num2) : stream.ReadBytes((long)num2, 1024));
                if (array3.LongLength != (long)num2)
                {
                    throw new WebSocketException("The 'Payload Data' of a frame cannot be read from the data source.");
                }
            }
            else
            {
                array3 = new byte[0];
            }
            webSocketFrame._payloadData = new PayloadData(array3, flag);
            if (unmask && flag)
            {
                webSocketFrame.Unmask();
            }
            return(webSocketFrame);
        }