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(); } }
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(); } } }