public WebSocketFrameInfo(
     WebSocketFrameType type,
     bool isFinal,
     bool masked,
     byte[] maskBytes,
     int payloadDataLen)
 {
     this.Type           = type;
     this.IsFinal        = isFinal;
     this.Masked         = masked;
     this.MaskBytes      = maskBytes;
     this.PayloadDataLen = payloadDataLen;
 }
Exemple #2
0
        static public byte GetFrameOpCode(WebSocketFrameType frameType)
        {
            switch (frameType)
            {
            case WebSocketFrameType.Text: return(0x1);

            case WebSocketFrameType.Binary: return(0x2);

            case WebSocketFrameType.Close: return(0x8);

            case WebSocketFrameType.Ping: return(0x9);

            case WebSocketFrameType.Pong: return(0xA);
            }

            throw new ArgumentOutOfRangeException(nameof(frameType), frameType, null);
        }
Exemple #3
0
        static public void Decode(
            ByteBuf byteBuf,
            byte[] maskBytes,
            out WebSocketFrameType type,
            out bool fin,
            out bool masked,
            out int payloadLen)
        {
            if (byteBuf.ReadableBytes() < 2)
            {
                throw new UnexpectedEndOfBufferException();
            }

            byte headerByte1 = byteBuf.ReadByte();
            byte headerByte2 = byteBuf.ReadByte();

            fin = (headerByte1 & Utils.MaskFin) == Utils.MaskFin;
            byte opCode = (byte)(headerByte1 & Utils.MaskOpCode);

            masked     = (headerByte2 & Utils.MaskMask) == Utils.MaskMask;
            payloadLen = (byte)(headerByte2 & Utils.MaskPayloadLen);

            type = Utils.GetFrameType(opCode);

            if (payloadLen > 125)
            {
                payloadLen = ReadExtPayloadLen(byteBuf, payloadLen);
            }

            if (masked)
            {
                ReadMask(byteBuf, maskBytes);
            }

            if (byteBuf.ReadableBytes() < payloadLen)
            {
                throw new UnexpectedEndOfBufferException();
            }
        }
Exemple #4
0
        internal WebSocketPacket ReadPacket()
        {
            var receivePacketEventArg = new SocketAsyncEventArgs();

            receivePacketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
            Debug.WriteLine("Reading metadata");
            var flagMaskAndPayloadMetadata = ReadDataFromSocket(receivePacketEventArg, 2);
            //var fragmented = false;
            //read the first byte
            var flag = (int)flagMaskAndPayloadMetadata[0];

            //if ((flag & 0x80) == 0x00)
            //{
            //    fragmented = true;
            //}
            byte[] payload = null;
            bool   masked  = true;

            byte[] mask   = null;
            var    opcode = flag & 0x0F;

            WebSocketFrameType frameType = (WebSocketFrameType)opcode;

            if (frameType == WebSocketFrameType.INVALID)
            {
                //TODO - throw exception
            }
            else
            {
                Debug.WriteLine("Reading payload length");
                //read the payload length
                var payLoadLength = (int)flagMaskAndPayloadMetadata[1];
                masked         = (payLoadLength & 0x80) == 0x80;
                payLoadLength &= 0x7F;
                if (payLoadLength == 126)
                {
                    var payLoadMetaData = ReadDataFromSocket(receivePacketEventArg, 2);
                    payLoadLength = ((int)payLoadMetaData[0]) & 0xFF;
                    payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData[1]) & 0xFF);
                }
                else if (payLoadLength == 127)
                {
                    var payLoadMetaData1 = ReadDataFromSocket(receivePacketEventArg, 8);
                    payLoadLength = payLoadMetaData1[0] & 0xFF;
                    payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[1]) & 0xFF);
                    payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[2]) & 0xFF);
                    payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[3]) & 0xFF);
                    payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[4]) & 0xFF);
                    payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[5]) & 0xFF);
                    payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[6]) & 0xFF);
                    payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[7]) & 0xFF);
                }
                if (masked)
                {
                    mask = ReadDataFromSocket(receivePacketEventArg, 4);
                }
                if (payLoadLength > 0)
                {
                    payload = ReadDataFromSocket(receivePacketEventArg, payLoadLength);
                    if (masked)
                    {
                        //TODO - implement for masking
                    }
                }
            }
            return(new WebSocketRawPacket(frameType, payload));
        }
        public static byte[] RawToProtocolPacket(WebSocketPacket aDataPacket)
        {
            byte[]             lBuff      = new byte[2];
            WebSocketFrameType lFrameType = aDataPacket.GetFrameType();
            int lTargetType = (int)lFrameType;

            if (lTargetType.Equals(-1))
            {
                throw new WebSocketRuntimeException("Cannot construct a packet with unknown packet type: " + lFrameType);
            }

            if (aDataPacket.IsEndFrame())
            {
                lBuff[0] = (byte)(lTargetType | 0x80);
            }
            else
            {
                lBuff[0] = (byte)(lTargetType);
            }

            int lPayloadLen = aDataPacket.GetByteArray().Length;

            if (lPayloadLen < 126)
            {
                lBuff[1] = (byte)(lPayloadLen | 0x80);
            }
            else if (lPayloadLen >= 126 && lPayloadLen < 0xFFFF)
            {
                lBuff[1] = (byte)(126 | 0x80);
                int lSize = lBuff.Length;
                lBuff            = CopyOf(lBuff, lSize + 2);
                lBuff[lSize]     = (byte)((lPayloadLen >> 8) & 0xFF);
                lBuff[lSize + 1] = (byte)(lPayloadLen & 0xFF);
            }
            else if (lPayloadLen >= 0xFFFF)
            {
                lBuff[1] = (byte)(127 | 0x80);
                long lLen  = (long)lPayloadLen;
                int  lSize = lBuff.Length;
                lBuff            = CopyOf(lBuff, lSize + 8);
                lBuff[lSize]     = (byte)(lLen >> 56);
                lBuff[lSize + 1] = (byte)(lLen >> 48);
                lBuff[lSize + 2] = (byte)(lLen >> 40);
                lBuff[lSize + 3] = (byte)(lLen >> 32);
                lBuff[lSize + 4] = (byte)(lLen >> 24);
                lBuff[lSize + 5] = (byte)(lLen >> 16);
                lBuff[lSize + 6] = (byte)(lLen >> 8);
                lBuff[lSize + 7] = (byte)lLen;
            }

            int lSizes = lBuff.Length;

            lBuff             = CopyOf(lBuff, lSizes + 4);
            lBuff[lSizes]     = (byte)mRan.Next(0, 255);
            lBuff[lSizes + 1] = (byte)mRan.Next(0, 255);
            lBuff[lSizes + 2] = (byte)mRan.Next(0, 255);
            lBuff[lSizes + 3] = (byte)mRan.Next(0, 255);

            byte[] lMask = new byte[4];
            Array.Copy(lBuff, lBuff.Length - 4, lMask, 0, 4);

            byte[] lBuffData = new byte[aDataPacket.GetByteArray().Length];
            Array.Copy(aDataPacket.GetByteArray(), 0, lBuffData, 0, lBuffData.Length);
            byte[] lMaskedData = new byte[lBuffData.Length];
            int    lPos        = 0;

            for (int i = 0; i < lBuffData.Length; i++)
            {
                lMaskedData[i] = (byte)Convert.ToInt32(lBuffData[i] ^ lMask[lPos]);
                if (lPos == 3)
                {
                    lPos = 0;
                }
                else
                {
                    lPos++;
                }
            }

            lBuff = CopyOf(lBuff, lBuff.Length + lMaskedData.Length);
            Array.Copy(lMaskedData, 0, lBuff, lBuff.Length - lMaskedData.Length, lMaskedData.Length);
            return(lBuff);
        }
        public static WebSocketPacket protocolToRawPacket(Stream aIS)
        {
            int lFlags = aIS.ReadByte();

            if (lFlags == -1)
            {
                return(null);
            }

            byte[] lBuff = new byte[0];

            bool lFragmented = false;

            if ((lFlags & 0x80) == 0x00)
            {
                lFragmented = true;
            }

            bool lMasked = true;

            int[] lMask = new int[4];

            int lOpcode = lFlags & 0x0F;

            WebSocketFrameType lFrameType = (WebSocketFrameType)lOpcode;

            if (lFrameType.Equals(WebSocketFrameType.INVALID))
            {
                throw new WebSocketException("Invalid frame type");
            }
            else
            {
                long lPayloadLen = Read(aIS);

                lMasked      = (lPayloadLen & 0x80) == 0x80;
                lPayloadLen &= 0x7F;

                if (lPayloadLen == 126)
                {
                    lPayloadLen = Read(aIS) & 0xFF;
                    lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF);
                }
                else if (lPayloadLen == 127)
                {
                    lPayloadLen = Read(aIS) & 0xFF;
                    lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF);
                    lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF);
                    lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF);
                    lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF);
                    lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF);
                    lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF);
                    lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF);
                }

                if (lMasked)
                {
                    lMask[0] = Read(aIS) & 0xFF;
                    lMask[1] = Read(aIS) & 0xFF;
                    lMask[2] = Read(aIS) & 0xFF;
                    lMask[3] = Read(aIS) & 0xFF;
                }

                if (lPayloadLen > 0)
                {
                    if (lMasked)
                    {
                        int j = 0;
                        while (lPayloadLen-- > 0)
                        {
                            WriteByte(ref lBuff, Convert.ToByte(Read(aIS) ^ lMask[j]));
                            j++;
                            j &= 3;
                        }
                    }
                    else
                    {
                        while (lPayloadLen-- > 0)
                        {
                            WriteByte(ref lBuff, (byte)Read(aIS));
                        }
                    }
                }
            }
            WebSocketPacket lRes = new WebSocketRawPacket(lFrameType, lBuff);

            return(lRes);
        }
Exemple #7
0
 public WebSocketPacket(WebSocketFrameType aFrameType, string aString)
 {
     mFrameType = aFrameType;
     SetString(aString);
 }
Exemple #8
0
 public WebSocketPacket(WebSocketFrameType aFrameType, byte[] aByteArray)
 {
     mFrameType = aFrameType;
     mByteArray = aByteArray;
 }
Exemple #9
0
        /// <summary>
        /// 重写发送,记录当前正在发送的数据实例
        /// </summary>
        /// <param name="io"></param>
        /// <param name="request"></param>
        /// <param name="frameType"></param>
        /// <returns></returns>
        public override int Send(IChannel io, IRequestInfo request, WebSocketFrameType frameType = WebSocketFrameType.Binary)
        {
            _sendObject = (SendObject)request.State;

            return(base.Send(io, request, frameType));
        }
        public static byte[] RawToProtocolPacket(IWebSocketPacket aDataPacket)
        {
            byte[]             lBuff      = new byte[2];
            WebSocketFrameType lFrameType = aDataPacket.FrameType;
            int lTargetType = (int)lFrameType;

            if (lTargetType.Equals(-1))
            {
                throw new WebSocketRuntimeException(WebSocketMessage.CANNOT_CONSTRUCT_PACKET
                                                    + WebSocketMessage.TWO_POINT + lFrameType);
            }

            if (aDataPacket.IsFragmented)
            {
                lBuff[0] = (byte)(lTargetType | 0x80);
            }
            else
            {
                lBuff[0] = (byte)(lTargetType);
            }

            int lPayloadLen = aDataPacket.ByteArray.Length;

            if (lPayloadLen < 126)
            {
                lBuff[1] = (byte)(lPayloadLen | 0x80);
            }
            else if (lPayloadLen >= 126 && lPayloadLen < 0xFFFF)
            {
                lBuff[1] = (byte)(126 | 0x80);
                int lSize = lBuff.Length;
                lBuff            = CopyOf(lBuff, lSize + 2);
                lBuff[lSize]     = (byte)((lPayloadLen >> 8) & 0xFF);
                lBuff[lSize + 1] = (byte)(lPayloadLen & 0xFF);
            }
            else if (lPayloadLen >= 0xFFFF)
            {
                lBuff[1] = (byte)(127 | 0x80);
                long lLen  = (long)lPayloadLen;
                int  lSize = lBuff.Length;
                lBuff            = CopyOf(lBuff, lSize + 8);
                lBuff[lSize]     = (byte)(lLen >> 56);
                lBuff[lSize + 1] = (byte)(lLen >> 48);
                lBuff[lSize + 2] = (byte)(lLen >> 40);
                lBuff[lSize + 3] = (byte)(lLen >> 32);
                lBuff[lSize + 4] = (byte)(lLen >> 24);
                lBuff[lSize + 5] = (byte)(lLen >> 16);
                lBuff[lSize + 6] = (byte)(lLen >> 8);
                lBuff[lSize + 7] = (byte)lLen;
            }

            int lSizes = lBuff.Length;

            lBuff             = CopyOf(lBuff, lSizes + 4);
            lBuff[lSizes]     = (byte)mRan.Next(0, 255);
            lBuff[lSizes + 1] = (byte)mRan.Next(0, 255);
            lBuff[lSizes + 2] = (byte)mRan.Next(0, 255);
            lBuff[lSizes + 3] = (byte)mRan.Next(0, 255);

            byte[] lMask = new byte[4];
            Array.Copy(lBuff, lBuff.Length - 4, lMask, 0, 4);

            byte[] lBuffData = new byte[aDataPacket.ByteArray.Length];
            Array.Copy(aDataPacket.ByteArray, 0, lBuffData, 0, lBuffData.Length);
            byte[] lMaskedData = new byte[lBuffData.Length];
            int    lPos        = 0;

            for (int i = 0; i < lBuffData.Length; i++)
            {
                lMaskedData[i] = (byte)Convert.ToInt32(lBuffData[i] ^ lMask[lPos]);
                if (lPos == 3)
                {
                    lPos = 0;
                }
                else
                {
                    lPos++;
                }
            }

            lBuff = CopyOf(lBuff, lBuff.Length + lMaskedData.Length);
            Array.Copy(lMaskedData, 0, lBuff, lBuff.Length - lMaskedData.Length, lMaskedData.Length);
            return(lBuff);
        }
 public void SetFrameType(WebSocketFrameType aFrameType)
 {
     mFrameType = aFrameType;
 }
Exemple #12
0
 public WebSocketPacket(WebSocketFrameType aFrameType, string aString)
 {
     mFrameType = aFrameType;
     SetString(aString);
 }
Exemple #13
0
 public WebSocketPacket(WebSocketFrameType aFrameType, byte[] aByteArray)
 {
     mFrameType = aFrameType;
     mByteArray = aByteArray;
 }
Exemple #14
0
        static public void Encode(
            ByteBuf outByteBuf,
            ByteBuf inByteBuf,
            byte[] maskBytes,
            WebSocketFrameType type,
            bool fin,
            bool masked,
            int payloadLen)
        {
            if (payloadLen > 65535)
            {
                throw new LargeWebSocketFramesNotSupportedException(payloadLen);
            }

            int totalDataLen =
                2 /* mandatoryHeader */ +
                payloadLen /* payload */ +
                (masked ? 4 : 0) /* mask */ +
                (payloadLen <= 125 ? 0 : 2) /* ext payload */;

            if (totalDataLen > outByteBuf.WritableBytes())
            {
                throw new NotEnoughAvailableBufferSizeToWriteException(outByteBuf.WritableBytes(), totalDataLen);
            }

            byte opCode = Utils.GetFrameOpCode(type);

            if (fin)
            {
                opCode = (byte)(opCode | Utils.MaskFin);
            }

            outByteBuf.Write(opCode);

            byte payloadLenAndMask;

            if (payloadLen <= 125)
            {
                payloadLenAndMask = (byte)payloadLen;
            }
            else
            {
                payloadLenAndMask = 126;
            }

            byte payloadLenByte = payloadLenAndMask;

            if (masked)
            {
                payloadLenAndMask = (byte)(payloadLenAndMask | Utils.MaskMask);
            }

            outByteBuf.Write(payloadLenAndMask);

            if (payloadLenByte == 126)
            {
                ByteConverters.ByteUnion2 byteUnion2 = new ByteConverters.ByteUnion2();
                byteUnion2.UShort = (ushort)payloadLen;
                outByteBuf.Write(byteUnion2.B2);
                outByteBuf.Write(byteUnion2.B1);
            }

            if (masked)
            {
                outByteBuf.Write(maskBytes[3]);
                outByteBuf.Write(maskBytes[2]);
                outByteBuf.Write(maskBytes[1]);
                outByteBuf.Write(maskBytes[0]);
            }

            // TODO: оптимизация
            for (int i = 0; i < payloadLen; i++)
            {
                byte @byte = inByteBuf.ReadByte();

                if (masked)
                {
                    outByteBuf.Write((byte)(@byte ^ maskBytes[i % 4]));
                }
                else
                {
                    outByteBuf.Write(@byte);
                }
            }
        }
Exemple #15
0
 public void SetFrameType(WebSocketFrameType aFrameType)
 {
     mFrameType = aFrameType;
 }