public ProtocolProcessingBehavior ProcessBufferForMessage(IConnection connection, IMessagePipeline pipeline, ref ReadOnlySequence <byte> buffer)
        {
            SequencePosition?position = null;
            var pipelineResult        = PipelineResult.Continue;

            do
            {
                position = buffer.PositionOfAny(_sentinels);

                if (position == null)
                {
                    continue;
                }

                pipelineResult = pipeline.ProcessMessage(connection, buffer.Slice(0, position.Value).ToArray(), this.DefaultResponse);

                buffer = buffer.Slice(buffer.GetPosition(1 + _readPastLength, position.Value));
            } while (position != null && pipelineResult == PipelineResult.Continue);

            if (pipelineResult == PipelineResult.StopAndDisconnect)
            {
                return(ProtocolProcessingBehavior.Disconnect);
            }

            return(ProtocolProcessingBehavior.ContinueProcessing);
        }
        public ProtocolProcessingBehavior ProcessBufferForMessage(IConnection connection, IMessagePipeline pipeline, ref ReadOnlySequence <byte> buffer)
        {
            var pipelineResult = PipelineResult.Continue;

            while (buffer.Length >= _messageLength && pipelineResult == PipelineResult.Continue)
            {
                pipelineResult = pipeline.ProcessMessage(connection, buffer.Slice(0, _messageLength).ToArray(), this.DefaultResponse);

                buffer = buffer.Slice(buffer.GetPosition(_messageLength));
            }

            if (pipelineResult == PipelineResult.StopAndDisconnect)
            {
                return(ProtocolProcessingBehavior.Disconnect);
            }

            return(ProtocolProcessingBehavior.ContinueProcessing);
        }
        public ProtocolProcessingBehavior ProcessBufferForMessage(IConnection connection, IMessagePipeline pipeline, ref ReadOnlySequence <byte> buffer)
        {
            var pipelineResult = PipelineResult.Continue;

            var waitForLength = _currentState == ProtocolState.WaitingForHeader ? _headerLength : _currentMessageLength;

            while (buffer.Length >= waitForLength && pipelineResult == PipelineResult.Continue)
            {
                var bytes = buffer.Slice(0, waitForLength).ToArray();

                if (_currentState == ProtocolState.WaitingForHeader)
                {
                    _currentMessageLength = _lengthCalculator(bytes);
                    waitForLength         = _currentMessageLength;
                    _currentState         = ProtocolState.WaitingForMessage;

                    if (buffer.Length < waitForLength)
                    {
                        continue;
                    }

                    bytes = buffer.Slice(0, waitForLength).ToArray();
                }

                pipelineResult = pipeline.ProcessMessage(connection, bytes, this.DefaultResponse);

                buffer        = buffer.Slice(buffer.GetPosition(waitForLength));
                _currentState = ProtocolState.WaitingForHeader;
            }

            if (pipelineResult == PipelineResult.StopAndDisconnect)
            {
                return(ProtocolProcessingBehavior.Disconnect);
            }

            return(ProtocolProcessingBehavior.ContinueProcessing);
        }