/// <summary>
    /// Handles the middleware.
    /// </summary>
    public async Task Invoke(HttpContext context)
    {
        var path = _httpContextService.Path;

        if (_settings?.Stub?.HealthcheckOnRootUrl == true && path == "/")
        {
            _httpContextService.SetStatusCode(HttpStatusCode.OK);
            await _httpContextService.WriteAsync("OK");

            return;
        }

        if (_segmentsToIgnore.Any(s => path.Contains(s, StringComparison.OrdinalIgnoreCase)))
        {
            await _next(context);

            return;
        }

        var correlationId = Guid.NewGuid().ToString();
        var requestLogger = _requestLoggerFactory.GetRequestLogger();

        requestLogger.SetCorrelationId(correlationId);
        ResponseModel response = null;

        try
        {
            response = await HandleRequest(correlationId);
        }
        catch (RequestValidationException e)
        {
            await HandleRequestValidationException(correlationId, e);
        }
        catch (Exception e)
        {
            HandleException(correlationId, e);
        }

        var loggingResult        = requestLogger.GetResult();
        var jsonLoggingResult    = JObject.FromObject(loggingResult);
        var enableRequestLogging = _settings?.Storage?.EnableRequestLogging ?? false;

        if (enableRequestLogging)
        {
            _logger.LogInformation($"Request: {jsonLoggingResult}");
        }

        await _stubContext.AddRequestResultAsync(loggingResult, response);

        // We need to map the model to a DTO here, because the frontend expects that.
        await _requestNotify.NewRequestReceivedAsync(_mapper.Map <RequestOverviewDto>(loggingResult));
    }
Ejemplo n.º 2
0
 /// <summary>
 /// Handles the middleware.
 /// </summary>
 public async Task Invoke(HttpContext context)
 {
     if (_httpContextService.Path?.Contains("ph-api/") == true)
     {
         try
         {
             await _next(context);
         }
         catch (ConflictException)
         {
             _httpContextService.SetStatusCode(HttpStatusCode.Conflict);
         }
         catch (NotFoundException)
         {
             _httpContextService.SetStatusCode(HttpStatusCode.NotFound);
         }
         catch (ForbiddenException)
         {
             _httpContextService.SetStatusCode(HttpStatusCode.Forbidden);
         }
         catch (ArgumentException ex)
         {
             _httpContextService.SetStatusCode(HttpStatusCode.BadRequest);
             _httpContextService.AddHeader("Content-Type", Constants.JsonMime);
             await _httpContextService.WriteAsync(JsonConvert.SerializeObject(new[] { ex.Message }));
         }
         catch (ValidationException ex)
         {
             _httpContextService.SetStatusCode(HttpStatusCode.BadRequest);
             _httpContextService.AddHeader("Content-Type", Constants.JsonMime);
             await _httpContextService.WriteAsync(JsonConvert.SerializeObject(ex.ValidationErrors));
         }
     }
     else
     {
         await _next(context);
     }
 }
 /// <summary>
 /// Handles the middleware.
 /// </summary>
 public async Task Invoke(HttpContext context)
 {
     if (_httpContextService.Path.Contains("ph-api/"))
     {
         _httpContextService.AddHeader("Access-Control-Allow-Origin", "*");
         _httpContextService.AddHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
         _httpContextService.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
         _httpContextService.AddHeader("Cache-Control", "no-store, no-cache");
         _httpContextService.AddHeader("Expires", "-1");
         if (_httpContextService.GetHeaders().ContainsKey("Origin") && _httpContextService.Method.Equals("OPTIONS"))
         {
             _httpContextService.SetStatusCode(HttpStatusCode.OK);
         }
         else
         {
             await _next(context);
         }
     }
     else
     {
         await _next(context);
     }
 }
Ejemplo n.º 4
0
        // ReSharper disable once UnusedMember.Global
        public async Task Invoke(HttpContext context)
        {
            var path = _httpContextService.Path;

            if (_segmentsToIgnore.Any(s => path.Contains(s, StringComparison.OrdinalIgnoreCase)))
            {
                await _next(context);

                return;
            }

            const string correlationHeaderKey = "X-HttPlaceholder-Correlation";
            var          correlation          = Guid.NewGuid().ToString();
            var          requestLogger        = _requestLoggerFactory.GetRequestLogger();

            requestLogger.SetCorrelationId(correlation);
            try
            {
                // Enable rewind here to be able to read the posted body multiple times.
                _httpContextService.EnableRewind();

                // Log the request here
                requestLogger.LogRequestParameters(
                    _httpContextService.Method,
                    _httpContextService.DisplayUrl,
                    _httpContextService.GetBody(),
                    _clientDataResolver.GetClientIp(),
                    _httpContextService.GetHeaders());

                _httpContextService.ClearResponse();
                _httpContextService.TryAddHeader(correlationHeaderKey, correlation);
                var response = await _stubRequestExecutor.ExecuteRequestAsync();

                _httpContextService.SetStatusCode(response.StatusCode);
                foreach (var(key, value) in response.Headers)
                {
                    _httpContextService.AddHeader(key, value);
                }

                if (response.Body != null)
                {
                    await _httpContextService.WriteAsync(response.Body);
                }
            }
            catch (RequestValidationException e)
            {
                _httpContextService.SetStatusCode((int)HttpStatusCode.InternalServerError);
                _httpContextService.TryAddHeader(correlationHeaderKey, correlation);
                _logger.LogInformation($"Request validation exception thrown: {e.Message}");
            }
            catch (Exception e)
            {
                _httpContextService.SetStatusCode((int)HttpStatusCode.InternalServerError);
                _httpContextService.TryAddHeader(correlationHeaderKey, correlation);
                _logger.LogWarning($"Unexpected exception thrown: {e}");
            }

            var loggingResult        = requestLogger.GetResult();
            var jsonLoggingResult    = JObject.FromObject(loggingResult);
            var enableRequestLogging = _settings.Storage?.EnableRequestLogging ?? false;

            if (enableRequestLogging)
            {
                _logger.LogInformation(jsonLoggingResult.ToString());
            }

            await _stubContext.AddRequestResultAsync(loggingResult);

            // We need to map the model to a DTO here, because the frontend expected that.
            await _requestNotify.NewRequestReceivedAsync(_mapper.Map <RequestResultDto>(loggingResult));
        }