Пример #1
0
        public WebSocketDecoderStateMachine()
        {
            var readHeaderStep      = new WebSocketReadHeaderStep();
            var readExtendedLenStep = new WebSocketReadExtendedPayloadLengthStep();
            var readMaskingKeyStep  = new WebSocketReadMaskingKeyStep();
            var readPayloadDataStep = new WebSocketReadPayloadDataStep();

            readHeaderStep.Init(readExtendedLenStep, readMaskingKeyStep, readPayloadDataStep);
            readExtendedLenStep.Init(readMaskingKeyStep, readPayloadDataStep);
            readMaskingKeyStep.Init(readPayloadDataStep);

            _readHeaderStep      = readHeaderStep;
            _readExtendedLenStep = readExtendedLenStep;
            _readMaskingKeyStep  = readMaskingKeyStep;
            _readPayloadDataStep = readPayloadDataStep;

            // TODO: пулинг byte[]
            _state = new WebSocketReadState(
                false /* fin */,
                0 /* opcode */,
                false /* mask */,
                0 /* payloadLen */,
                0 /* extendedPayloadLen */,
                new byte[4] /* maskingKeys */
                );

            _currentStep = _readHeaderStep;
        }
        public void Read(
            ByteBuf byteBuf,
            ref WebSocketReadState state,
            out WebSocketFrame frame,
            out IWebSocketDecoderStep nextStep)
        {
            frame    = null;
            nextStep = null;

            if (byteBuf.ReadableBytes() < 4)
            {
                return;
            }

            state.MaskingKey[0] = byteBuf.ReadByte();
            state.MaskingKey[1] = byteBuf.ReadByte();
            state.MaskingKey[2] = byteBuf.ReadByte();
            state.MaskingKey[3] = byteBuf.ReadByte();

            nextStep = _readPayloadDataStep;
        }
Пример #3
0
        public void Read(
            ByteBuf byteBuf,
            ref WebSocketReadState state,
            out WebSocketFrame frame,
            out IWebSocketDecoderStep nextStep)
        {
            frame    = null;
            nextStep = null;

            throw new NotSupportedException();

            if (state.PayloadLen == 126)
            {
                if (byteBuf.ReadableBytes() < 2)
                {
                    return;
                }

                state.ExtendedPayloadLen = byteBuf.ReadUShort();
            }
            else if (state.PayloadLen == 127)
            {
                if (byteBuf.ReadableBytes() < 8)
                {
                    return;
                }

                state.ExtendedPayloadLen = byteBuf.ReadULong();
            }

            if (state.Mask)
            {
                nextStep = _readMaskingKeyStep;
            }
            else
            {
                nextStep = _readPayloadDataStep;
            }
        }
Пример #4
0
        public void Read(
            ByteBuf byteBuf,
            ref WebSocketReadState state,
            out WebSocketFrame frame,
            out IWebSocketDecoderStep nextStep)
        {
            frame    = null;
            nextStep = null;

            if (byteBuf.ReadableBytes() < 2)
            {
                return;
            }

            state.Clear();

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

            state.Fin        = (headerByte1 & Utils.MaskFin) == Utils.MaskFin;
            state.OpCode     = (byte)(headerByte1 & Utils.MaskOpCode);
            state.Mask       = (headerByte2 & Utils.MaskMask) == Utils.MaskMask;
            state.PayloadLen = (byte)(headerByte2 & Utils.MaskPayloadLen);

            if (state.PayloadLen > 125)
            {
                nextStep = _readExtendedLenStep;
            }
            else if (state.Mask)
            {
                nextStep = _readMaskingKeyStep;
            }
            else
            {
                nextStep = _readPayloadDataStep;
            }
        }
        public void Read(
            ByteBuf byteBuf,
            ref WebSocketReadState state,
            out WebSocketFrame frame,
            out IWebSocketDecoderStep nextStep)
        {
            frame    = null;
            nextStep = null;

            if (byteBuf.ReadableBytes() < state.PayloadLen)
            {
                return;
            }

            // TODO: alloc ByteBuf
            byte[] frameBytes = new byte[state.PayloadLen];

            // TODO: оптимизация
            for (int i = 0; i < state.PayloadLen; i++)
            {
                frameBytes[i] = byteBuf.ReadByte();
            }

            if (state.Mask)
            {
                for (int i = 0; i < frameBytes.Length; i++)
                {
                    frameBytes[i] ^= state.MaskingKey[i % 4];
                }
            }

            frame         = new WebSocketFrame();
            frame.IsFinal = state.Fin;
            frame.Type    = Utils.GetFrameType(state.OpCode);
            frame.Bytes   = frameBytes;
        }