private void PushIncoming(RequestHead head) { lock (Sync) { gotReqHead = true; BodyType?type = BodyType.TryDetectFor(head, true); if (type == null) { Terminate(); return; } if (!IncomingBody.TrySetFor(type.Value)) { Terminate(); return; } IncomingRequest incoming = _Incoming = new IncomingRequest(this, head); OutgoingResponse outgoing = _Outgoing = new OutgoingResponse(this, head.Version); RequestHandler(incoming, outgoing); if (Ended || Frozen) { return; } if (!IncomingBody.Finished) { IncomingBody.Pipe(_Incoming); IncomingBody.OnFinish += FinishIncomingMessage; excess.Burst(IncomingBody); if (!gotReqBody) { Base.Pipe(IncomingBody); } } } }