public void Read(
            ByteBuf byteBuf,
            ref WebSocketReadState state,
            out WebSocketFrameInfo?frameInfo,
            out IWebSocketDecoderStep nextStep)
        {
            frameInfo = null;
            nextStep  = null;

            int factPayloadLen = state.ExtendedPayloadLen > 0
                ? (int)state.ExtendedPayloadLen
                : state.PayloadLen;

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

            byte[] mask = new byte[4];
            state.MaskingKey.CopyTo(mask, 0);

            frameInfo = new WebSocketFrameInfo(
                Utils.GetFrameType(state.OpCode),
                state.Fin,
                state.Mask,
                mask,
                factPayloadLen
                );
        }
        public void Read(
            ByteBuf byteBuf,
            ref WebSocketReadState state,
            out WebSocketFrameInfo?frameInfo,
            out IWebSocketDecoderStep nextStep)
        {
            frameInfo = null;
            nextStep  = null;

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

                state.ExtendedPayloadLen = byteBuf.ReadUShort();
            }
            else if (state.PayloadLen == 127)
            {
                throw new NotSupportedException();
            }

            nextStep = state.Mask
                ? _readMaskingKeyStep
                : _readPayloadDataStep;
        }
Beispiel #3
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;
        }
Beispiel #4
0
 public void Init(
     IWebSocketDecoderStep readExtendedLenStep,
     IWebSocketDecoderStep readMaskingKeyStep,
     IWebSocketDecoderStep readPayloadDataStep)
 {
     _readExtendedLenStep = readExtendedLenStep;
     _readMaskingKeyStep  = readMaskingKeyStep;
     _readPayloadDataStep = readPayloadDataStep;
 }
        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;
        }
Beispiel #6
0
        public void Read(ByteBuf byteBuf, out WebSocketFrame frame)
        {
            IWebSocketDecoderStep nextStep;

            do
            {
                _currentStep.Read(byteBuf, ref _state, out frame, out nextStep);
                if (nextStep != null)
                {
                    _currentStep.Clear();
                    _currentStep = nextStep;
                }
            }
            // Прерываемся только если текущий шаг не может быть закончен (буфер закончился) или если есть фрейм.
            while (nextStep != null && frame == null);

            // Если есть фрейм, то нужно сбросить состояние, чтобы при следующем чтении начинать с исходного состояния.
            if (frame != null)
            {
                Clear();
            }
        }
Beispiel #7
0
        public void Read(
            ByteBuf byteBuf,
            ref WebSocketReadState state,
            out WebSocketFrameInfo?frameInfo,
            out IWebSocketDecoderStep nextStep)
        {
            frameInfo = 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;
        }
 public void Init(IWebSocketDecoderStep readPayloadDataStep)
 {
     _readPayloadDataStep = readPayloadDataStep;
 }
Beispiel #10
0
 public void Clear()
 {
     _currentStep.Clear();
     _currentStep = _readHeaderStep;
     _state.Clear();
 }