Ejemplo n.º 1
0
            void ev_writedone()
            {
                if (_state == _State.Failure) {
                    Dispose();

                } else if (_state == _State.Send100Continue) {
                    ev_requestbodyready();
                    _HandleCurrentState();

                } else if (_state == _State.SendResponseBody) {
                    _state  = _State.ResponseBodyUserWait;
                    var cb  = _responsebody_user_cb;
                    var buf = _responsebody_buffer;
                    _server._DispatchCallback(() => cb(buf));

                } else if (_state == _State.SendResponseBodyLast) {
                    // clear out all state
                    _tx                             = null;
                    _readoff                        = 0;
                    _readcount                      = 0;
                    _readbuf                        = new byte[4096];
                    _readoff                        = 0;
                    _readcount                      = 0;
                    _headerstate                    = _HeaderState.FirstLine;
                    _linems                         = new MemoryStream();
                    _firstline                      = null;
                    _headerlines                    = new List<string>();
                    _writeoff                       = 0;
                    _writecount                     = 0;
                    _writebytes                     = null;
                    _requestbody_left               = 0;
                    _requestbody_full               = null;
                    _requestbody_multipart          = null;
                    _requestbody_streaming_started  = false;
                    _requestbody_buffer             = null;
                    _requestbody_user_cb            = null;
                    _responsebody_streaming_started = false;
                    _responsebody_buffer            = null;
                    _responsebody_user_cb           = null;
                    _responsebody_done_cb           = null;
                    _responsebody_left              = -1;
                    _state                          = _State.RequestHeaders;

                    if (_isconnectionclose || _ishttp10) {
                        Dispose();
                    } else {
                        _HandleCurrentState();
                    }

                } else if (_state == _State.SendResponseHeaders) {
                    _state = _State.ResponseBodyUserWait;
                    _server._DispatchCallback(() => _responsebody_user_cb(_responsebody_buffer));

                } else {
                    throw new InvalidOperationException();
                }
            }
Ejemplo n.º 2
0
            void ev_requestheaders_buffer()
            {
                bool done = false;
                for (; !done && _readcount > 0; _readoff++, _readcount--) {
                    switch (_headerstate) {
                        case _HeaderState.FirstLine:
                            if (_readbuf[_readoff] == (byte)'\r') {
                                _headerstate = _HeaderState.FirstLineR;
                            } else {
                                _linems.WriteByte(_readbuf[_readoff]);
                            }
                            break;

                        case _HeaderState.FirstLineR:
                            if (_readbuf[_readoff] == (byte)'\n') {
                                _firstline = Encoding.UTF8.GetString(_linems.ToArray());
                                _linems = new MemoryStream();
                                _headerstate = _HeaderState.HeaderLine;
                            } else {
                                _linems.WriteByte((byte)'\r');
                                _linems.WriteByte(_readbuf[_readoff]);
                                _headerstate = _HeaderState.FirstLine;
                            }
                            break;

                        case _HeaderState.HeaderLine:
                            if (_readbuf[_readoff] == (byte)'\r') {
                                if (_linems.Length == 0)
                                    _headerstate = _HeaderState.LastHeaderLineR;
                                else
                                    _headerstate = _HeaderState.HeaderLineR;
                            } else {
                                _linems.WriteByte(_readbuf[_readoff]);
                            }
                            break;

                        case _HeaderState.HeaderLineR:
                            if (_readbuf[_readoff] == (byte)'\n') {
                                _headerlines.Add(Encoding.UTF8.GetString(_linems.ToArray()));
                                _linems = new MemoryStream();
                                _headerstate = _HeaderState.HeaderLine;
                            } else {
                                _linems.WriteByte((byte)'\r');
                                _linems.WriteByte(_readbuf[_readoff]);
                                _headerstate = _HeaderState.HeaderLine;
                            }
                            break;

                        case _HeaderState.LastHeaderLineR:
                            if (_readbuf[_readoff] == (byte)'\n') {
                                ev_headersdone();
                                done = true;
                            } else {
                                _linems.WriteByte((byte)'\r');
                                _linems.WriteByte(_readbuf[_readoff]);
                                _headerstate = _HeaderState.HeaderLine;
                            }
                            break;

                        default:
                            throw new InvalidOperationException();
                    }
                }
            }