Пример #1
0
        public bool Consume(Baton baton, Action<Frame, Exception> callback)
        {
            for (; ;)
            {
                switch (_mode)
                {
                    case Mode.StartLine:
                        if (baton.RemoteIntakeFin)
                        {
                            _mode = Mode.Terminated;
                            return false;
                        }

                        if (!TakeStartLine(baton))
                        {
                            return false;
                        }

                        _mode = Mode.MessageHeader;
                        break;

                    case Mode.MessageHeader:
                        if (baton.RemoteIntakeFin)
                        {
                            _mode = Mode.Terminated;
                            return false;
                        }

                        var endOfHeaders = false;
                        while (!endOfHeaders)
                        {
                            if (!TakeMessageHeader(baton, out endOfHeaders))
                            {
                                return false;
                            }
                        }

                        var resumeBody = HandleExpectContinue(callback);
                        _messageBody = MessageBody.For(
                            _httpVersion,
                            _requestHeaders,
                            () =>
                            {
                                try
                                {
                                    if (Consume(baton, resumeBody))
                                        return;
                                }
                                catch (Exception ex)
                                {
                                    resumeBody.Invoke(this, ex);
                                    return;
                                }
                                resumeBody.Invoke(this, null);
                            });
                        _keepAlive = _messageBody.RequestKeepAlive;
                        _mode = Mode.MessageBody;
                        baton.Free();
                        Execute();
                        return true;

                    case Mode.MessageBody:
                        return _messageBody.Consume(baton, ex => callback(this, ex));

                    case Mode.Terminated:
                        return false;
                }
            }
        }
Пример #2
0
        private void Go(bool newFrame, Frame frame)
        {
            if (newFrame)
            {
                frame = _frame = new Frame(
                    new FrameContext
                {
                    Services = _services,
                    Socket   = _socket,
                    App      = _app,
                    Write    = _socketSender.Write,
                    Flush    = _socketSender.Flush,
                    End      = ProduceEnd
                });

                if (_baton.Buffer.Count != 0)
                {
                    if (frame.Consume(
                            _baton,
                            _frameConsumeCallback))
                    {
                        return;
                    }
                }
            }

            while (frame.LocalIntakeFin == false)
            {
                SocketError recvError;
                var         buffer       = _baton.Available(128);
                var         receiveCount = _socket.Receive(
                    buffer.Array,
                    buffer.Offset,
                    buffer.Count,
                    SocketFlags.None,
                    out recvError);

                if (recvError == SocketError.WouldBlock)
                {
                    _baton.Free();
                    if (ReceiveAsync(frame))
                    {
                        return;
                    }

                    continue;
                }

                if (recvError != SocketError.Success || receiveCount == 0)
                {
                    _baton.RemoteIntakeFin = true;
                }
                else
                {
                    _baton.Extend(receiveCount);
                }

                if (frame.Consume(
                        _baton,
                        _frameConsumeCallback))
                {
                    return;
                }
            }
        }
Пример #3
0
        public bool Consume(Baton baton, Action <Frame, Exception> callback)
        {
            for (; ;)
            {
                switch (_mode)
                {
                case Mode.StartLine:
                    if (baton.RemoteIntakeFin)
                    {
                        _mode = Mode.Terminated;
                        return(false);
                    }

                    if (!TakeStartLine(baton))
                    {
                        return(false);
                    }

                    _mode = Mode.MessageHeader;
                    break;

                case Mode.MessageHeader:
                    if (baton.RemoteIntakeFin)
                    {
                        _mode = Mode.Terminated;
                        return(false);
                    }

                    var endOfHeaders = false;
                    while (!endOfHeaders)
                    {
                        if (!TakeMessageHeader(baton, out endOfHeaders))
                        {
                            return(false);
                        }
                    }

                    var resumeBody = HandleExpectContinue(callback);
                    _messageBody = MessageBody.For(
                        _httpVersion,
                        _requestHeaders,
                        () =>
                    {
                        try
                        {
                            if (Consume(baton, resumeBody))
                            {
                                return;
                            }
                        }
                        catch (Exception ex)
                        {
                            resumeBody.Invoke(this, ex);
                            return;
                        }
                        resumeBody.Invoke(this, null);
                    });
                    _keepAlive = _messageBody.RequestKeepAlive;
                    _mode      = Mode.MessageBody;
                    baton.Free();
                    Execute();
                    return(true);

                case Mode.MessageBody:
                    return(_messageBody.Consume(baton, ex => callback(this, ex)));

                case Mode.Terminated:
                    return(false);
                }
            }
        }