Exemple #1
0
        /*
         * public bool LocalIntakeFin
         * {
         *  get
         *  {
         *      return _mode == Mode.MessageBody
         *          ? _messageBody.LocalIntakeFin
         *          : _mode == Mode.Terminated;
         *  }
         * }
         */
        public void Consume()
        {
            var input = SocketInput;

            for (; ;)
            {
                switch (_mode)
                {
                case Mode.StartLine:
                    if (input.Buffer.Count == 0 && input.RemoteIntakeFin)
                    {
                        _mode = Mode.Terminated;
                        return;
                    }

                    if (!TakeStartLine(input))
                    {
                        if (input.RemoteIntakeFin)
                        {
                            _mode = Mode.Terminated;
                        }
                        return;
                    }

                    _mode = Mode.MessageHeader;
                    break;

                case Mode.MessageHeader:
                    if (input.Buffer.Count == 0 && input.RemoteIntakeFin)
                    {
                        _mode = Mode.Terminated;
                        return;
                    }

                    var endOfHeaders = false;
                    while (!endOfHeaders)
                    {
                        if (!TakeMessageHeader(input, out endOfHeaders))
                        {
                            if (input.RemoteIntakeFin)
                            {
                                _mode = Mode.Terminated;
                            }
                            return;
                        }
                    }

                    //var resumeBody = HandleExpectContinue(callback);
                    _mode = Mode.MessageBody;
                    Execute();
                    break;

                case Mode.MessageBody:
                    if (MessageBody.LocalIntakeFin)
                    {
                        // NOTE: stop reading and resume on keepalive?
                        return;
                    }
                    MessageBody.Consume();
                    // NOTE: keep looping?
                    return;

                case Mode.Terminated:
                    return;
                }
            }
        }