예제 #1
0
        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);
                    }
                }
            }
        }