Пример #1
0
        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);
        }
Пример #2
0
        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);
        }