void InvokeRequestHandler()

in src/Microsoft.Azure.Relay/HybridHttpConnection.cs [176:223]


        void InvokeRequestHandler(RequestCommandAndStream requestAndStream)
        {
            ListenerCommand.RequestCommand requestCommand = requestAndStream.RequestCommand;
            Uri requestUri = new Uri(this.listener.Address, requestCommand.RequestTarget);
            var listenerContext = new RelayedHttpListenerContext(
                this.listener,
                requestUri,
                requestCommand.Id,
                requestCommand.Method,
                requestCommand.RequestHeaders);
            listenerContext.Request.SetRemoteAddress(requestCommand.RemoteEndpoint);
            listenerContext.Response.StatusCode = HttpStatusCode.OK;
            listenerContext.Response.OutputStream = new ResponseStream(this, listenerContext);

            RelayEventSource.Log.HybridHttpRequestReceived(listenerContext.TrackingContext, requestCommand.Method);

            Stream requestStream = requestAndStream.Stream;
            if (requestStream != null)
            {
                listenerContext.Request.HasEntityBody = true;
                listenerContext.Request.InputStream = requestStream;
            }

            var requestHandler = this.listener.RequestHandler;
            if (requestHandler != null)
            {
                try
                {
                    RelayEventSource.Log.HybridHttpInvokingUserRequestHandler();
                    requestHandler(listenerContext);
                }
                catch (Exception userException) when (!Fx.IsFatal(userException))
                {
                    RelayEventSource.Log.HandledExceptionAsWarning(this, userException);
                    listenerContext.Response.StatusCode = HttpStatusCode.InternalServerError;
                    listenerContext.Response.StatusDescription = this.TrackingContext.EnsureTrackableMessage(SR.RequestHandlerException);
                    listenerContext.Response.CloseAsync().Fork(this);
                    return;
                }
            }
            else
            {
                RelayEventSource.Log.HybridHttpConnectionMissingRequestHandler();
                listenerContext.Response.StatusCode = HttpStatusCode.NotImplemented;
                listenerContext.Response.StatusDescription = this.TrackingContext.EnsureTrackableMessage(SR.RequestHandlerMissing);
                listenerContext.Response.CloseAsync().Fork(this);
            }
        }