using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Stef.Validation; using WireMock.Server; namespace WireMock.Net.AspNetCore.Middleware.HttpDelegatingHandler; /// /// DelegatingHandler that takes requests made via the /// and routes them to the . /// internal class WireMockDelegationHandler : DelegatingHandler { private readonly ILogger _logger; private readonly WireMockServerInstance _server; private readonly IHttpContextAccessor _httpContextAccessor; private readonly WireMockDelegationHandlerSettings _settings; /// /// Creates a new instance of /// public WireMockDelegationHandler( ILogger logger, WireMockServerInstance server, IHttpContextAccessor httpContextAccessor, WireMockDelegationHandlerSettings settings ) { _server = Guard.NotNull(server); _httpContextAccessor = Guard.NotNull(httpContextAccessor); _logger = Guard.NotNull(logger); _settings = Guard.NotNull(settings); } /// protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { Guard.NotNull(request); if (_settings.AlwaysRedirect || IsWireMockRedirectHeaderSetToTrue()) { _logger.LogDebug("Redirecting request to WireMock server"); if (_server.Instance?.Url != null) { request.RequestUri = new Uri(_server.Instance.Url + request.RequestUri!.PathAndQuery); } } if (TryGetDelayHeaderValue(out var delayInMs)) { await Task.Delay(delayInMs, cancellationToken); } return await base.SendAsync(request, cancellationToken); } private bool IsWireMockRedirectHeaderSetToTrue() { var httpContext = _httpContextAccessor.HttpContext; if (httpContext is null) { _logger.LogDebug("HttpContext is not available in current runtime environment"); return false; } return httpContext.Request.Headers.TryGetValue(AppConstants.HEADER_REDIRECT, out var values) && bool.TryParse(values.ToString(), out var shouldRedirectToWireMock) && shouldRedirectToWireMock; } private bool TryGetDelayHeaderValue(out int delayInMs) { delayInMs = 0; var httpContext = _httpContextAccessor.HttpContext; if (httpContext is null) { _logger.LogDebug("HttpContext is not available in current runtime environment"); return false; } return httpContext.Request.Headers.TryGetValue(AppConstants.HEADER_RESPONSE_DELAY, out var values) && int.TryParse(values.ToString(), out delayInMs); } }