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