Ejemplo n.º 1
0
 public override byte[] ToBytes() => ByteHelpers.Combine(
     new byte[]
 {
     Ver.ToByte(), Cmd.ToByte(), Rsv.ToByte(), Atyp.ToByte()
 },
     DstAddr.ToBytes(),
     DstPort.ToBytes());
Ejemplo n.º 2
0
        private static WsFrame readHeader(byte[] header)
        {
            // FIN
            Fin fin = (header[0] & 0x80) == 0x80 ? Fin.FINAL : Fin.MORE;
            // RSV1
            Rsv rsv1 = (header[0] & 0x40) == 0x40 ? Rsv.ON : Rsv.OFF;
            // RSV2
            Rsv rsv2 = (header[0] & 0x20) == 0x20 ? Rsv.ON : Rsv.OFF;
            // RSV3
            Rsv rsv3 = (header[0] & 0x10) == 0x10 ? Rsv.ON : Rsv.OFF;
            // Opcode
            Opcode opcode = (Opcode)(header[0] & 0x0f);
            // MASK
            Mask masked = (header[1] & 0x80) == 0x80 ? Mask.MASK : Mask.UNMASK;
            // Payload len
            byte payloadLen = (byte)(header[1] & 0x7f);

            return(new WsFrame {
                Fin = fin,
                Rsv1 = rsv1,
                Rsv2 = rsv2,
                Rsv3 = rsv3,
                Opcode = opcode,
                Masked = masked,
                PayloadLen = payloadLen
            });
        }
Ejemplo n.º 3
0
        private static WebSocketFrame processHeader(byte[] header)
        {
            string str;

            if ((int)header.Length != 2)
            {
                throw new WebSocketException("The header of a frame cannot be read from the stream.");
            }
            WebSocketSharp.Fin fin = ((header[0] & 128) == 128 ? WebSocketSharp.Fin.Final : WebSocketSharp.Fin.More);
            Rsv  rsv  = ((header[0] & 64) == 64 ? Rsv.On : Rsv.Off);
            Rsv  rsv1 = ((header[0] & 32) == 32 ? Rsv.On : Rsv.Off);
            Rsv  rsv2 = ((header[0] & 16) == 16 ? Rsv.On : Rsv.Off);
            byte num  = (byte)(header[0] & 15);

            WebSocketSharp.Mask mask = ((header[1] & 128) == 128 ? WebSocketSharp.Mask.On : WebSocketSharp.Mask.Off);
            byte num1 = (byte)(header[1] & 127);

            if (!num.IsSupported())
            {
                str = "An unsupported opcode.";
            }
            else if (!num.IsData() && rsv == Rsv.On)
            {
                str = "A non data frame is compressed.";
            }
            else if (num.IsControl() && fin == WebSocketSharp.Fin.More)
            {
                str = "A control frame is fragmented.";
            }
            else if (!num.IsControl() || num1 <= 125)
            {
                str = null;
            }
            else
            {
                str = "A control frame has a long payload length.";
            }
            string str1 = str;

            if (str1 != null)
            {
                throw new WebSocketException(CloseStatusCode.ProtocolError, str1);
            }
            WebSocketFrame webSocketFrames = new WebSocketFrame()
            {
                _fin           = fin,
                _rsv1          = rsv,
                _rsv2          = rsv1,
                _rsv3          = rsv2,
                _opcode        = (WebSocketSharp.Opcode)num,
                _mask          = mask,
                _payloadLength = num1
            };

            return(webSocketFrames);
        }
Ejemplo n.º 4
0
 public WebSocketFrameHeader(Fin fin, Mask mask, Opcode opcode, ulong payloadLength)
 {
     myFin            = fin;
     myMask           = mask;
     Opcode           = opcode;
     myPayloadLength  = PayloadLengthByte(payloadLength);
     ExtPayloadLength = payloadLength;
     myRsv1           = Rsv.Off;
     myRsv2           = Rsv.Off;
     myRsv3           = Rsv.Off;
 }
Ejemplo n.º 5
0
        internal WebSocketFrame(
            Fin fin,
            Opcode opcode,
            PayloadData payloadData,
            bool compressed,
            bool mask
            )
        {
            _fin    = fin;
            _opcode = opcode;

            _rsv1 = opcode.IsData() && compressed ? Rsv.On : Rsv.Off;
            _rsv2 = Rsv.Off;
            _rsv3 = Rsv.Off;

            var len = payloadData.Length;

            if (len < 126)
            {
                _payloadLength    = (byte)len;
                _extPayloadLength = WebSocket.EmptyBytes;
            }
            else if (len < 0x010000)
            {
                _payloadLength    = (byte)126;
                _extPayloadLength = ((ushort)len).InternalToByteArray(ByteOrder.Big);
            }
            else
            {
                _payloadLength    = (byte)127;
                _extPayloadLength = len.InternalToByteArray(ByteOrder.Big);
            }

            if (mask)
            {
                _mask       = Mask.On;
                _maskingKey = createMaskingKey();

                payloadData.Mask(_maskingKey);
            }
            else
            {
                _mask       = Mask.Off;
                _maskingKey = WebSocket.EmptyBytes;
            }

            _payloadData = payloadData;
        }
Ejemplo n.º 6
0
        private WebSocketFrame(Fin fin, Opcode opcode, PayloadData payloadData, bool compressed, bool mask)
        {
            _fin    = fin;
            _rsv1   = IsData(opcode) && compressed ? Rsv.On : Rsv.Off;
            _rsv2   = Rsv.Off;
            _rsv3   = Rsv.Off;
            _opcode = opcode;

            var len = payloadData.Length;

            if (len < 126)
            {
                _payloadLength    = (byte)len;
                _extPayloadLength = new byte[0];
            }
            else if (len < 0x010000)
            {
                _payloadLength    = 126;
                _extPayloadLength = ((ushort)len).InternalToByteArray(ByteOrder.Big);
            }
            else
            {
                _payloadLength    = 127;
                _extPayloadLength = len.InternalToByteArray(ByteOrder.Big);
            }

            if (mask)
            {
                _mask       = Mask.Mask;
                _maskingKey = CreateMaskingKey();
                payloadData.Mask(_maskingKey);
            }
            else
            {
                _mask       = Mask.Unmask;
                _maskingKey = new byte[0];
            }

            _payloadData = payloadData;
        }
Ejemplo n.º 7
0
        internal WebSocketFrame(
            Fin fin, Opcode opcode, Mask mask, PayloadData payload, bool compressed)
        {
            _fin    = fin;
            _rsv1   = isData(opcode) && compressed ? Rsv.On : Rsv.Off;
            _rsv2   = Rsv.Off;
            _rsv3   = Rsv.Off;
            _opcode = opcode;
            _mask   = mask;

            var len = payload.Length;

            if (len < 126)
            {
                _payloadLength    = (byte)len;
                _extPayloadLength = new byte[0];
            }
            else if (len < 0x010000)
            {
                _payloadLength    = (byte)126;
                _extPayloadLength = ((ushort)len).ToByteArrayInternally(ByteOrder.Big);
            }
            else
            {
                _payloadLength    = (byte)127;
                _extPayloadLength = len.ToByteArrayInternally(ByteOrder.Big);
            }

            if (mask == Mask.Mask)
            {
                _maskingKey = createMaskingKey();
                payload.Mask(_maskingKey);
            }
            else
            {
                _maskingKey = new byte[0];
            }

            _payloadData = payload;
        }
Ejemplo n.º 8
0
        private void readHeader(Stream stream, bool unmask, Action <WebSocketFrame> completed, Action <Exception> error)
        {
            stream.ReadBytesAsync(
                2,
                header =>
            {
                if (header.Length != 2)
                {
                    error(new WebSocketException("The header part of a frame cannot be read from the data source."));
                    return;
                }

                _fin           = (header[0] & 0x80) == 0x80 ? Fin.Final : Fin.More;
                _rsv1          = (header[0] & 0x40) == 0x40 ? Rsv.On : Rsv.Off;
                _rsv2          = (header[0] & 0x20) == 0x20 ? Rsv.On : Rsv.Off;
                _rsv3          = (header[0] & 0x10) == 0x10 ? Rsv.On : Rsv.Off;
                _opcode        = (Opcode)(header[0] & 0x0f);
                _mask          = (header[1] & 0x80) == 0x80 ? Mask.Mask : Mask.Unmask;
                _payloadLength = (byte)(header[1] & 0x7f);

                // Check if valid header.
                var err = isControl(_opcode) && _payloadLength > 125
                    ? "A control frame has payload data which is greater than the allowable max length."
                    : 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)
                {
                    error(new WebSocketException(CloseStatusCode.ProtocolError, err));
                    return;
                }

                readExtPayload(stream, unmask, completed, error);
            },
                error);
        }
Ejemplo n.º 9
0
        //internal WebSocketFrame(string textMessage)
        //    :this()
        public WebSocketFrame(Fin fin, Opcode opcode, PayLoadData payLoadData, bool mask = false)
        {
            Fin    = fin;
            Rsv2   = Rsv.Off;
            Rsv3   = Rsv.Off;
            Rsv4   = Rsv.Off;
            Opcode = opcode;

            var len = payLoadData.Length;

            if (len < 126)
            {
                PayloadLength         = (byte)len;
                ExtendedPayloadLength = new byte[0];
            }
            else if (len < 65536)
            {
                PayloadLength         = 126;
                ExtendedPayloadLength = ((ushort)len).InternalToByteArray(ByteOrder.Big);
            }
            else
            {
                PayloadLength         = 127;
                ExtendedPayloadLength = len.InternalToByteArray(ByteOrder.Big);
            }

            if (mask)
            {
                Mask = Mask.On;
            }
            else
            {
                Mask       = Mask.Off;
                MaskingKey = new byte[0];
            }

            PayloadData = payLoadData;
        }
Ejemplo n.º 10
0
        internal WebSocketFrame(WebSocketSharp.Fin fin, WebSocketSharp.Opcode opcode, WebSocketSharp.PayloadData payloadData, bool compressed, bool mask)
        {
            this._fin    = fin;
            this._rsv1   = (!opcode.IsData() || !compressed) ? Rsv.Off : Rsv.On;
            this._rsv2   = Rsv.Off;
            this._rsv3   = Rsv.Off;
            this._opcode = opcode;
            ulong length = payloadData.Length;

            if (length < 0x7e)
            {
                this._payloadLength    = (byte)length;
                this._extPayloadLength = WebSocket.EmptyBytes;
            }
            else if (length < 0x10000L)
            {
                this._payloadLength    = 0x7e;
                this._extPayloadLength = ((ushort)length).InternalToByteArray(ByteOrder.Big);
            }
            else
            {
                this._payloadLength    = 0x7f;
                this._extPayloadLength = length.InternalToByteArray(ByteOrder.Big);
            }
            if (!mask)
            {
                this._mask       = WebSocketSharp.Mask.Off;
                this._maskingKey = WebSocket.EmptyBytes;
            }
            else
            {
                this._mask       = WebSocketSharp.Mask.On;
                this._maskingKey = createMaskingKey();
                payloadData.Mask(this._maskingKey);
            }
            this._payloadData = payloadData;
        }
Ejemplo n.º 11
0
        internal WebSocketFrame(Fin fin, Opcode opcode, PayloadData payloadData, bool compressed, bool mask)
        {
            _fin    = fin;
            _rsv1   = ((isData(opcode) && compressed) ? Rsv.On : Rsv.Off);
            _rsv2   = Rsv.Off;
            _rsv3   = Rsv.Off;
            _opcode = opcode;
            ulong length = payloadData.Length;

            if (length < 126)
            {
                _payloadLength    = (byte)length;
                _extPayloadLength = new byte[0];
            }
            else if (length < 65536)
            {
                _payloadLength    = 126;
                _extPayloadLength = ((ushort)length).InternalToByteArray(ByteOrder.Big);
            }
            else
            {
                _payloadLength    = 127;
                _extPayloadLength = length.InternalToByteArray(ByteOrder.Big);
            }
            if (mask)
            {
                _mask       = Mask.Mask;
                _maskingKey = createMaskingKey();
                payloadData.Mask(_maskingKey);
            }
            else
            {
                _mask       = Mask.Unmask;
                _maskingKey = new byte[0];
            }
            _payloadData = payloadData;
        }
Ejemplo n.º 12
0
        internal WebSocketFrame(WebSocketSharp.Fin fin, WebSocketSharp.Opcode opcode, WebSocketSharp.PayloadData payloadData, bool compressed, bool mask)
        {
            this._fin    = fin;
            this._rsv1   = (opcode.IsData() & compressed ? Rsv.On : Rsv.Off);
            this._rsv2   = Rsv.Off;
            this._rsv3   = Rsv.Off;
            this._opcode = opcode;
            ulong length = payloadData.Length;

            if (length < (long)126)
            {
                this._payloadLength    = (byte)length;
                this._extPayloadLength = WebSocket.EmptyBytes;
            }
            else if (length >= (long)65536)
            {
                this._payloadLength    = 127;
                this._extPayloadLength = length.InternalToByteArray(ByteOrder.Big);
            }
            else
            {
                this._payloadLength    = 126;
                this._extPayloadLength = ((ushort)length).InternalToByteArray(ByteOrder.Big);
            }
            if (!mask)
            {
                this._mask       = WebSocketSharp.Mask.Off;
                this._maskingKey = WebSocket.EmptyBytes;
            }
            else
            {
                this._mask       = WebSocketSharp.Mask.On;
                this._maskingKey = WebSocketFrame.createMaskingKey();
                payloadData.Mask(this._maskingKey);
            }
            this._payloadData = payloadData;
        }
 public override byte[] ToBytes() => ByteHelpers.Combine(new byte[] { Ver.ToByte(), Rep.ToByte(), Rsv.ToByte(), Atyp.ToByte() }, BndAddr.ToBytes(), BndPort.ToBytes());
Ejemplo n.º 14
0
 public static extern bool HP_HttpServer_SendWSMessage(IntPtr pServer, IntPtr dwConnId, bool bFinal, Rsv iRsv, OpCode iOperationCode, IntPtr pdata, int iLength, ulong ullBodyLen);
Ejemplo n.º 15
0
        private static WsFrame parse(byte[] header, Stream stream, bool unmask)
        {
            Fin    fin    = ((header[0] & 128) != 128) ? Fin.More : Fin.Final;
            Rsv    rsv    = ((header[0] & 64) != 64) ? Rsv.Off : Rsv.On;
            Rsv    rsv2   = ((header[0] & 32) != 32) ? Rsv.Off : Rsv.On;
            Rsv    rsv3   = ((header[0] & 16) != 16) ? Rsv.Off : Rsv.On;
            Opcode opcode = (Opcode)(header[0] & 15);
            Mask   mask   = ((header[1] & 128) != 128) ? Mask.Unmask : Mask.Mask;
            byte   b      = header[1] & 127;
            string text   = (!WsFrame.isControl(opcode) || fin != Fin.More) ? ((WsFrame.isData(opcode) || rsv != Rsv.On) ? null : "A non data frame is compressed.") : "A control frame is fragmented.";

            if (text != null)
            {
                throw new WebSocketException(CloseStatusCode.IncorrectData, text);
            }
            if (WsFrame.isControl(opcode) && b > 125)
            {
                throw new WebSocketException(CloseStatusCode.InconsistentData, "The payload data length of a control frame is greater than 125 bytes.");
            }
            WsFrame wsFrame = new WsFrame
            {
                Fin        = fin,
                Rsv1       = rsv,
                Rsv2       = rsv2,
                Rsv3       = rsv3,
                Opcode     = opcode,
                Mask       = mask,
                PayloadLen = 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.");
            }
            wsFrame.ExtPayloadLen = 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.");
            }
            wsFrame.MaskingKey = array2;
            ulong num2 = (b >= 126) ? ((b != 126) ? array.ToUInt64(ByteOrder.Big) : ((ulong)array.ToUInt16(ByteOrder.Big))) : ((ulong)b);

            byte[] array3;
            if (num2 > 0UL)
            {
                if (b > 126 && num2 > 9223372036854775807UL)
                {
                    throw new WebSocketException(CloseStatusCode.TooBig, "The 'Payload Data' length is greater than the allowable 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];
            }
            PayloadData payloadData = new PayloadData(array3, flag);

            if (flag && unmask)
            {
                payloadData.Mask(array2);
                wsFrame.Mask       = Mask.Unmask;
                wsFrame.MaskingKey = new byte[0];
            }
            wsFrame.PayloadData = payloadData;
            return(wsFrame);
        }
Ejemplo n.º 16
0
 public static extern bool HP_HttpAgent_SendWSMessage(IntPtr pAgent, IntPtr dwConnId, bool bFinal, Rsv iRsv, OpCode iOperationCode, IntPtr lpszMask, IntPtr pData, int iLength, ulong ullBodyLen);
Ejemplo n.º 17
0
 public static extern bool HP_HttpClient_GetWSMessageState(IntPtr pClient, ref bool lpbFinal, ref Rsv lpiRsv, ref OpCode lpiOperationCode, ref IntPtr lpszMask, ref ulong bodyLen, ref ulong bodyRemain);
Ejemplo n.º 18
0
 public static extern bool HP_HttpClient_SendWSMessage(IntPtr pClient, bool bFinal, Rsv iRsv, OpCode iOperationCode, IntPtr lpszMask, IntPtr pData, int iLength, ulong bodyLen);
Ejemplo n.º 19
0
        protected new HandleResult SdkOnWsMessageHeader(IntPtr sender, IntPtr connId, bool final, Rsv rsv, OpCode opCode, byte[] mask, ulong bodyLength)
        {
            if (OnEasyWebSocketMessageData == null)
            {
                return(HandleResult.Ignore);
            }

            var extra = _easyWsMessageData.Get(connId) ?? new WebSocketSession();

            extra.Final  = final;
            extra.Rsv    = rsv;
            extra.OpCode = opCode;
            extra.Mask   = mask;
            extra.Data   = null;
            extra.Data   = new List <byte>((int)bodyLength);

            return(_easyWsMessageData.Set(connId, extra) ? HandleResult.Ok : HandleResult.Error);
        }
        bool ReadHeader()
        {
            if (!_myBufferStream.Ensure(2))
            {
                return(false);
            }
            //----------------------------------------------------------
            //when we read header we start a new websocket request
            _currentReq = new WebSocketRequest(this.OwnerWebSocketConnBase);

#if DEBUG
            //byte[] peek = new byte[8];
            //_myBufferStream.dbugPeekBytes(peek, 8);

            //System.Text.StringBuilder stbuilder = new System.Text.StringBuilder();
            //for (int i = 0; i < peek.Length; ++i)
            //{
            //    stbuilder.Append((char)peek[i]);
            //}
#endif

            byte b1 = _myBufferStream.ReadByte();

            // FIN
            Fin fin = (b1 & (1 << 7)) == (1 << 7) ? Fin.Final : Fin.More;

            // RSV1
            Rsv rsv1 = (b1 & (1 << 6)) == (1 << 6) ? Rsv.On : Rsv.Off;

            // RSV2
            Rsv rsv2 = (b1 & (1 << 5)) == (1 << 5) ? Rsv.On : Rsv.Off;

            // RSV3
            Rsv rsv3 = (b1 & (1 << 4)) == (1 << 4) ? Rsv.On : Rsv.Off;
            //----------------------------------------------------------
            // Opcode
            _currentOpCode = (Opcode)(b1 & 0x0f);//4 bits
            //----------------------------------------------------------

            if (rsv1 == Rsv.On)
            {
                _currentReq.Compression = OwnerWebSocketConnBase.Compression;
            }


            byte b2 = _myBufferStream.ReadByte();          //mask

            //----------------------------------------------------------
            //finish first 2 bytes
            // MASK
            Mask currentMask = (b2 & (1 << 7)) == (1 << 7) ? Mask.On : Mask.Off;
            //we should check receive frame here ...

            if (_asClientContext)
            {
                //as client context (we are in client context)
                if (currentMask != Mask.Off)
                {
                    throw new NotSupportedException();
                }
                _useMask = false;
            }
            else
            {
                //as server context (we are in server context)
                //data from client must useMask
                if (currentMask != Mask.On)
                {
                    throw new NotSupportedException();
                }
                _useMask = true;
            }
            //----------------------------------------------------------
            // Payload Length
            byte payloadLen = (byte)(b2 & 0x7f); //is 7 bits of the b2

            bool allowMoreFrame = false;
            if (fin == Fin.More || _currentOpCode == Opcode.Cont)
            {
                throw new NotSupportedException();
            }
            else
            {
            }

            //----------------------------------------------------------
            //translate opcode ....
            string errCode = null;
            switch (_currentOpCode)
            {
            case Opcode.Cont:
            {
                //continue
            }
            break;

            case Opcode.Text:     //this is data
            {
                if (rsv1 == Rsv.On && _currentReq.Compression == WebSocketContentCompression.NoCompression)
                {
                    errCode = "A non data frame is compressed.";
                }
            }
            break;

            case Opcode.Binary:     //this is data
            {
                if (rsv1 == Rsv.On && _currentReq.Compression == WebSocketContentCompression.NoCompression)
                {
                    errCode = "A non data frame is compressed.";
                }
            }
            break;

            case Opcode.Close:     //control
            {
                if (fin == Fin.More)
                {
                    errCode = "A control frame is fragmented.";
                }
                else if (payloadLen > 125)
                {
                    errCode = "A control frame has a long payload length.";
                }
            }
            break;

            case Opcode.Ping:     //control
            case Opcode.Pong:     //control
            {
                if (fin == Fin.More)
                {
                    errCode = "A control frame is fragmented.";
                }
                else if (payloadLen > 125)
                {
                    errCode = "A control frame has a long payload length.";
                }
            }
            break;

            default:
            {
                if (fin != Fin.More)
                {
                    errCode = "An unsupported opcode.";
                }
            }
            break;
            }
            //----------------------------------------------------------
            if (errCode != null)
            {
                //report error
                throw new NotSupportedException();
            }
            //----------------------------------------------------------
            _currentPacketLen  = payloadLen;
            _currentReq.OpCode = _currentOpCode;
            _currentMaskLen    = (currentMask == Mask.On) ? 4 : 0;
            //----------------------------------------------------------
            if (payloadLen >= 126)
            {
                _parseState = ParseState.ReadExtendedPayloadLen;
                return(true);
            }
            //----------------------------------------------------------
            _parseState = _currentMaskLen > 0 ?
                          ParseState.ReadMask :
                          ParseState.ExpectBody;
            return(true);
        }
Ejemplo n.º 21
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);
        }
        bool ReadHeader()
        {
            if (!myBufferStream.Ensure(2))
            {
                myBufferStream.BackupRecvIO();
                return(false);
            }
            //----------------------------------------------------------
            //when we read header we start a new websocket request
            currentReq = new WebSocketRequest(this._ownerContext);
            incommingReqs.Enqueue(currentReq);


            byte b1 = myBufferStream.ReadByte();
            // FIN
            Fin fin = (b1 & (1 << 7)) == (1 << 7) ? Fin.Final : Fin.More;

            // RSV1
            Rsv rsv1 = (b1 & (1 << 6)) == (1 << 6) ? Rsv.On : Rsv.Off;

            // RSV2
            Rsv rsv2 = (b1 & (1 << 5)) == (1 << 5) ? Rsv.On : Rsv.Off;

            // RSV3
            Rsv rsv3 = (b1 & (1 << 4)) == (1 << 4) ? Rsv.On : Rsv.Off;

            //----------------------------------------------------------
            // Opcode
            currentOpCode = (Opcode)(b1 & 0x0f); //4 bits
            //----------------------------------------------------------
            byte b2 = myBufferStream.ReadByte(); //mask

            //----------------------------------------------------------
            //finish first 2 bytes
            // MASK
            Mask currentMask = (b2 & (1 << 7)) == (1 << 7) ? Mask.On : Mask.Off;

            //we should check receive frame here ...
            this.useMask = currentMask == Mask.On;
            if (currentMask == Mask.Off)
            {
                //if this act as WebSocketServer
                //erro packet ?
                throw new NotSupportedException();
            }
            else
            {
            }
            //----------------------------------------------------------
            // Payload Length
            byte payloadLen = (byte)(b2 & 0x7f); //is 7 bits of the b2

            if (fin == Fin.More || currentOpCode == Opcode.Cont)
            {
                //process fragment frame ***
                throw new NotSupportedException();
            }
            else
            {
            }

            //----------------------------------------------------------
            //translate opcode ....
            string errCode = null;

            switch (currentOpCode)
            {
            case Opcode.Cont:
            {
                //continue
            }
            break;

            case Opcode.Text:     //this is data
            {
                if (rsv1 == Rsv.On)
                {
                    errCode = "A non data frame is compressed.";
                }
            }
            break;

            case Opcode.Binary:     //this is data
            {
                if (rsv1 == Rsv.On)
                {
                    errCode = "A non data frame is compressed.";
                }
            }
            break;

            case Opcode.Close:     //control
            {
                if (fin == Fin.More)
                {
                    errCode = "A control frame is fragmented.";
                }
                else if (payloadLen > 125)
                {
                    errCode = "A control frame has a long payload length.";
                }
            }
            break;

            case Opcode.Ping:     //control
            case Opcode.Pong:     //control
            {
                if (fin == Fin.More)
                {
                    errCode = "A control frame is fragmented.";
                }
                else if (payloadLen > 125)
                {
                    errCode = "A control frame has a long payload length.";
                }
            }
            break;

            default:
            {
                if (fin != Fin.More)
                {
                    errCode = "An unsupported opcode.";
                }
            }
            break;
            }
            //----------------------------------------------------------
            if (errCode != null)
            {
                //report error
                throw new NotSupportedException();
            }
            //----------------------------------------------------------
            this._currentPacketLen = payloadLen;
            currentReq.OpCode      = currentOpCode;
            this._currentMaskLen   = (currentMask == Mask.On) ? 4 : 0;
            //----------------------------------------------------------
            if (payloadLen >= 126)
            {
                this.parseState = ParseState.ReadExtendedPayloadLen;
                return(true);
            }
            //----------------------------------------------------------
            this.parseState = this._currentMaskLen > 0 ?
                              ParseState.ReadMask :
                              ParseState.ExpectBody;
            return(true);
        }
Ejemplo n.º 23
0
 public static extern bool HP_HttpServer_GetWSMessageState(IntPtr pServer, IntPtr dwConnId, ref bool lpbFinal, ref Rsv lpiRsv, ref OpCode lpiOperationCode, ref IntPtr lpszMask, ref ulong bodyLen, ref ulong bodyRemain);