public async Task <IOnPremiseTargetResponse> GetResponseFromLocalTargetAsync(string url, IOnPremiseTargetRequest request, string relayedRequestHeader) { if (url == null) { throw new ArgumentNullException(nameof(url)); } if (request == null) { throw new ArgumentNullException(nameof(request)); } _logger?.Verbose("Requesting response from on-premise web target. request-id={RequestId}, url={RequestUrl}, origin-id={OriginId}", request.RequestId, url, request.OriginId); var response = new OnPremiseTargetResponse() { RequestId = request.RequestId, OriginId = request.OriginId, RequestStarted = DateTime.UtcNow, }; try { var message = await SendLocalRequestWithTimeoutAsync(url, request, relayedRequestHeader).ConfigureAwait(false); response.StatusCode = message.StatusCode; response.HttpHeaders = message.Headers.Union(message.Content.Headers).ToDictionary(kvp => kvp.Key, kvp => String.Join(" ", kvp.Value)); response.Stream = await message.Content.ReadAsStreamAsync().ConfigureAwait(false); response.HttpResponseMessage = message; } catch (Exception ex) { _logger?.Error(ex, "Error requesting response from local target. request-id={RequestId}", request.RequestId); response.StatusCode = HttpStatusCode.GatewayTimeout; response.HttpHeaders = new Dictionary <string, string> { ["X-TTRELAY-TIMEOUT"] = "On-Premise Target" }; } response.RequestFinished = DateTime.UtcNow; _logger?.Verbose("Got web response. request-id={RequestId}, status-code={ResponseStatusCode}", response.RequestId, response.StatusCode); return(response); }
public async Task <IOnPremiseTargetResponse> GetResponseFromLocalTargetAsync(string url, IOnPremiseTargetRequest request, string relayedRequestHeader) { if (url == null) { throw new ArgumentNullException(nameof(url)); } if (request == null) { throw new ArgumentNullException(nameof(request)); } _logger?.Verbose("Requesting response from on-premise in-proc target. request-id={RequestId}, url={RequestUrl}, origin-id={OriginId}", request.RequestId, url, request.OriginId); var response = new OnPremiseTargetResponse() { RequestId = request.RequestId, OriginId = request.OriginId, RequestStarted = DateTime.UtcNow, HttpHeaders = new Dictionary <string, string>(), }; try { var handler = CreateHandler(); try { using (var cts = new CancellationTokenSource(_requestTimeout)) { await handler.ProcessRequest(request, response, cts.Token).ConfigureAwait(false); if (cts.IsCancellationRequested) { _logger?.Warning("Gateway timeout. request-id={RequestId}", request.RequestId); response.StatusCode = HttpStatusCode.GatewayTimeout; response.HttpHeaders = new Dictionary <string, string> { ["X-TTRELAY-TIMEOUT"] = "On-Premise Target" }; } } } catch (Exception ex) { _logger?.Debug(ex, "Error requesting response from in-proc target. request-id={RequestId}", request.RequestId); response.StatusCode = HttpStatusCode.InternalServerError; response.HttpHeaders = new Dictionary <string, string> { ["Content-Type"] = "text/plain" }; response.Stream = new MemoryStream(Encoding.UTF8.GetBytes(ex.ToString())); } finally { // ReSharper disable once SuspiciousTypeConversion.Global (handler as IDisposable)?.Dispose(); } } catch (Exception ex) { _logger?.Warning(ex, "Error creating in-proc handler. request-id={RequestId}", request.RequestId); response.StatusCode = HttpStatusCode.InternalServerError; response.HttpHeaders = new Dictionary <string, string> { ["Content-Type"] = "text/plain" }; response.Stream = new MemoryStream(Encoding.UTF8.GetBytes(ex.ToString())); } response.RequestFinished = DateTime.UtcNow; _logger?.Verbose("Got in-proc response. request-id={RequestId}, status-code={ResponseStatusCode}", response.RequestId, response.StatusCode); return(response); }