internal bool ReceiveFromBufferedPayload(ArraySegment <byte> buffer, out WebSocketReceiveResult receiveResult)
        {
            ThrowIfDisposed();
            ValidateBufferedPayload();

            int bytesTransferred = Math.Min(buffer.Count, _bufferedPayloadReceiveResult.Count);

            _bufferedPayloadReceiveResult.Count -= bytesTransferred;

            receiveResult = new WebSocketReceiveResult(
                bytesTransferred,
                _bufferedPayloadReceiveResult.MessageType,
                _bufferedPayloadReceiveResult.Count == 0 && _bufferedPayloadReceiveResult.EndOfMessage);

            Buffer.BlockCopy(_payloadBuffer.Array,
                             _payloadBuffer.Offset + _payloadOffset,
                             buffer.Array,
                             buffer.Offset,
                             bytesTransferred);

            bool morePayloadBuffered;

            if (_bufferedPayloadReceiveResult.Count == 0)
            {
                _payloadOffset = 0;
                _bufferedPayloadReceiveResult = null;
                morePayloadBuffered           = false;
            }
            else
            {
                _payloadOffset     += bytesTransferred;
                morePayloadBuffered = true;
                this.ValidateBufferedPayload();
            }

            return(morePayloadBuffered);
        }
        internal void BufferPayload(ArraySegment <byte> payload,
                                    int unconsumedDataOffset,
                                    WebSocketMessageType messageType,
                                    bool endOfMessage)
        {
            ThrowIfDisposed();
            int bytesBuffered = payload.Count - unconsumedDataOffset;

            Debug.Assert(_payloadOffset == 0,
                         "'m_PayloadOffset' MUST be '0' at this point.");
            Debug.Assert(_bufferedPayloadReceiveResult == null || _bufferedPayloadReceiveResult.Count == 0,
                         "'_bufferedPayloadReceiveResult.Count' MUST be '0' at this point.");

            Buffer.BlockCopy(payload.Array,
                             payload.Offset + unconsumedDataOffset,
                             _payloadBuffer.Array,
                             _payloadBuffer.Offset,
                             bytesBuffered);

            _bufferedPayloadReceiveResult =
                new PayloadReceiveResult(bytesBuffered, messageType, endOfMessage);

            this.ValidateBufferedPayload();
        }