Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions src/WireMock.Net.Minimal/IResponseMessageBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Copyright © WireMock.Net

using System.Net;

namespace WireMock;

internal interface IResponseMessageBuilder
{
ResponseMessage Create(HttpStatusCode statusCode, string? status, Guid? guid = null);

ResponseMessage Create(int statusCode, string? status, Guid? guid = null);

ResponseMessage Create(int statusCode, string? status, string? error, Guid? guid = null);

ResponseMessage Create(HttpStatusCode statusCode);
}
8 changes: 6 additions & 2 deletions src/WireMock.Net.Minimal/MappingBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public class MappingBuilder : IMappingBuilder
private readonly MappingToFileSaver _mappingToFileSaver;
private readonly IGuidUtils _guidUtils;
private readonly IDateTimeUtils _dateTimeUtils;
private readonly IResponseMessageBuilder _responseMessageBuilder;

/// <summary>
/// Create a MappingBuilder
Expand All @@ -43,6 +44,7 @@ public MappingBuilder(WireMockServerSettings? settings = null)

_guidUtils = new GuidUtils();
_dateTimeUtils = new DateTimeUtils();
_responseMessageBuilder = new ResponseMessageBuilder(_dateTimeUtils);
}

internal MappingBuilder(
Expand All @@ -51,7 +53,8 @@ internal MappingBuilder(
MappingConverter mappingConverter,
MappingToFileSaver mappingToFileSaver,
IGuidUtils guidUtils,
IDateTimeUtils dateTimeUtils
IDateTimeUtils dateTimeUtils,
IResponseMessageBuilder responseMessageBuilder
)
{
_settings = Guard.NotNull(settings);
Expand All @@ -60,12 +63,13 @@ IDateTimeUtils dateTimeUtils
_mappingToFileSaver = Guard.NotNull(mappingToFileSaver);
_guidUtils = Guard.NotNull(guidUtils);
_dateTimeUtils = Guard.NotNull(dateTimeUtils);
_responseMessageBuilder = Guard.NotNull(responseMessageBuilder);
}

/// <inheritdoc />
public IRespondWithAProvider Given(IRequestMatcher requestMatcher, bool saveToFile = false)
{
return new RespondWithAProvider(RegisterMapping, Guard.NotNull(requestMatcher), _settings, _guidUtils, _dateTimeUtils, saveToFile);
return new RespondWithAProvider(RegisterMapping, Guard.NotNull(requestMatcher), _settings, _guidUtils, _dateTimeUtils, _responseMessageBuilder, saveToFile);
}

/// <inheritdoc />
Expand Down
1 change: 1 addition & 0 deletions src/WireMock.Net.Minimal/Owin/AspNetCoreSelfHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ public Task StartAsync()
services.AddSingleton<IOwinResponseMapper, OwinResponseMapper>();
services.AddSingleton<IGuidUtils, GuidUtils>();
services.AddSingleton<IDateTimeUtils, DateTimeUtils>();
services.AddSingleton<IResponseMessageBuilder, ResponseMessageBuilder>();
services.AddSingleton<LogEntryMapper>();
services.AddSingleton<IWireMockMiddlewareLogger, WireMockMiddlewareLogger>();

Expand Down
6 changes: 4 additions & 2 deletions src/WireMock.Net.Minimal/Owin/GlobalExceptionMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@ internal class GlobalExceptionMiddleware
{
private readonly IWireMockMiddlewareOptions _options;
private readonly IOwinResponseMapper _responseMapper;
private readonly IResponseMessageBuilder _responseMessageBuilder;

public GlobalExceptionMiddleware(RequestDelegate next, IWireMockMiddlewareOptions options, IOwinResponseMapper responseMapper)
public GlobalExceptionMiddleware(RequestDelegate next, IWireMockMiddlewareOptions options, IOwinResponseMapper responseMapper, IResponseMessageBuilder responseMessageBuilder)
{
Next = next;
_options = Guard.NotNull(options);
_responseMapper = Guard.NotNull(responseMapper);
_responseMessageBuilder = Guard.NotNull(responseMessageBuilder);
}

public RequestDelegate Next { get; }
Expand All @@ -35,7 +37,7 @@ private async Task InvokeInternalAsync(HttpContext ctx)
catch (Exception ex)
{
_options.Logger.Error("HttpStatusCode set to 500 {0}", ex);
await _responseMapper.MapAsync(ResponseMessageBuilder.Create(500, JsonConvert.SerializeObject(ex)), ctx.Response).ConfigureAwait(false);
await _responseMapper.MapAsync(_responseMessageBuilder.Create(500, JsonConvert.SerializeObject(ex)), ctx.Response).ConfigureAwait(false);
}
}
}
13 changes: 7 additions & 6 deletions src/WireMock.Net.Minimal/Owin/WireMockMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ internal class WireMockMiddleware(
IMappingMatcher mappingMatcher,
IWireMockMiddlewareLogger logger,
IGuidUtils guidUtils,
IDateTimeUtils dateTimeUtils
IDateTimeUtils dateTimeUtils,
IResponseMessageBuilder responseMessageBuilder
)
{
private readonly object _lock = new();
Expand Down Expand Up @@ -97,7 +98,7 @@ private async Task InvokeInternalAsync(HttpContext ctx)
{
logRequest = true;
options.Logger.Warn("HttpStatusCode set to 404 : No matching mapping found");
response = ResponseMessageBuilder.Create(HttpStatusCode.NotFound, WireMockConstants.NoMatchingFound);
response = responseMessageBuilder.Create(HttpStatusCode.NotFound, WireMockConstants.NoMatchingFound);
return;
}

Expand All @@ -109,15 +110,15 @@ private async Task InvokeInternalAsync(HttpContext ctx)
if (!authorizationHeaderPresent)
{
options.Logger.Error("HttpStatusCode set to 401, authorization header is missing.");
response = ResponseMessageBuilder.Create(HttpStatusCode.Unauthorized, null);
response = responseMessageBuilder.Create(HttpStatusCode.Unauthorized, null);
return;
}

var authorizationHeaderMatchResult = options.AuthenticationMatcher.IsMatch(authorization!.ToString());
if (!MatchScores.IsPerfect(authorizationHeaderMatchResult.Score))
{
options.Logger.Error("HttpStatusCode set to 401, authentication failed.", authorizationHeaderMatchResult.Exception ?? throw new WireMockException("Authentication failed"));
response = ResponseMessageBuilder.Create(HttpStatusCode.Unauthorized, null);
response = responseMessageBuilder.Create(HttpStatusCode.Unauthorized, null);
return;
}
}
Expand Down Expand Up @@ -165,7 +166,7 @@ private async Task InvokeInternalAsync(HttpContext ctx)
options.Logger.Error($"Providing a Response for Mapping '{result.Match?.Mapping.Guid}' failed. HttpStatusCode set to 500. Exception: {ex}");
WireMockActivitySource.RecordException(activity, ex);

response = ResponseMessageBuilder.Create(500, ex.Message);
response = responseMessageBuilder.Create(500, ex.Message);
}
finally
{
Expand All @@ -179,7 +180,7 @@ private async Task InvokeInternalAsync(HttpContext ctx)
{
options.Logger.Error("HttpStatusCode set to 404 : No matching mapping found", ex);

var notFoundResponse = ResponseMessageBuilder.Create(HttpStatusCode.NotFound, WireMockConstants.NoMatchingFound);
var notFoundResponse = responseMessageBuilder.Create(HttpStatusCode.NotFound, WireMockConstants.NoMatchingFound);
await responseMapper.MapAsync(notFoundResponse, ctx.Response).ConfigureAwait(false);
}
}
Expand Down
15 changes: 8 additions & 7 deletions src/WireMock.Net.Minimal/ResponseMessageBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,29 +9,30 @@

namespace WireMock;

internal static class ResponseMessageBuilder
internal class ResponseMessageBuilder(IDateTimeUtils dateTimeUtils) : IResponseMessageBuilder
{
private static readonly IDictionary<string, WireMockList<string>> ContentTypeJsonHeaders = new Dictionary<string, WireMockList<string>>
{
{ HttpKnownHeaderNames.ContentType, new WireMockList<string> { WireMockConstants.ContentTypeJson } }
};

internal static ResponseMessage Create(HttpStatusCode statusCode, string? status, Guid? guid = null)
public ResponseMessage Create(HttpStatusCode statusCode, string? status, Guid? guid = null)
{
return Create((int)statusCode, status, guid);
return Create((int)statusCode, status, null, guid);
}

internal static ResponseMessage Create(int statusCode, string? status, Guid? guid = null)
public ResponseMessage Create(int statusCode, string? status, Guid? guid = null)
{
return Create(statusCode, status, null, guid);
}

internal static ResponseMessage Create(int statusCode, string? status, string? error, Guid? guid = null)
public ResponseMessage Create(int statusCode, string? status, string? error, Guid? guid = null)
{
var response = new ResponseMessage
{
StatusCode = statusCode,
Headers = ContentTypeJsonHeaders
Headers = ContentTypeJsonHeaders,
DateTime = dateTimeUtils.UtcNow
};

if (status != null || error != null)
Expand All @@ -51,7 +52,7 @@ internal static ResponseMessage Create(int statusCode, string? status, string? e
return response;
}

internal static ResponseMessage Create(HttpStatusCode statusCode)
public ResponseMessage Create(HttpStatusCode statusCode)
{
return new ResponseMessage
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

namespace WireMock.ResponseProviders;

internal class WebSocketResponseProvider(WebSocketBuilder builder, IGuidUtils guidUtils, IDateTimeUtils dateTimeUtils) : IResponseProvider
internal class WebSocketResponseProvider(WebSocketBuilder builder, IGuidUtils guidUtils, IDateTimeUtils dateTimeUtils, IResponseMessageBuilder responseMessageBuilder) : IResponseProvider
{
public async Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(
IMapping mapping,
Expand All @@ -27,7 +27,7 @@ internal class WebSocketResponseProvider(WebSocketBuilder builder, IGuidUtils gu
// Check if this is a WebSocket upgrade request
if (!context.WebSockets.IsWebSocketRequest)
{
return (ResponseMessageBuilder.Create(HttpStatusCode.BadRequest, "Bad Request: Not a WebSocket upgrade request"), null);
return (responseMessageBuilder.Create(HttpStatusCode.BadRequest, "Bad Request: Not a WebSocket upgrade request"), null);
}

if (!context.Items.TryGetValue<IWireMockMiddlewareOptions>(nameof(IWireMockMiddlewareOptions), out var options))
Expand Down Expand Up @@ -110,7 +110,7 @@ internal class WebSocketResponseProvider(WebSocketBuilder builder, IGuidUtils gu
// If we haven't upgraded yet, we can return HTTP error
if (!context.Response.HasStarted)
{
return (ResponseMessageBuilder.Create(HttpStatusCode.InternalServerError, $"WebSocket error: {ex.Message}"), null);
return (responseMessageBuilder.Create(HttpStatusCode.InternalServerError, $"WebSocket error: {ex.Message}"), null);
}

// Already upgraded - return marker
Expand Down
6 changes: 5 additions & 1 deletion src/WireMock.Net.Minimal/Server/RespondWithAProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ internal class RespondWithAProvider : IRespondWithAProvider
private readonly WireMockServerSettings _settings;
private readonly IDateTimeUtils _dateTimeUtils;
private readonly IGuidUtils _guidUtils;
private readonly IResponseMessageBuilder _responseMessageBuilder;

private readonly bool _saveToFile;

Expand Down Expand Up @@ -56,6 +57,7 @@ internal RespondWithAProvider(
WireMockServerSettings settings,
IGuidUtils guidUtils,
IDateTimeUtils dateTimeUtils,
IResponseMessageBuilder responseMessageBuilder,
bool saveToFile = false
)
{
Expand All @@ -64,6 +66,7 @@ internal RespondWithAProvider(
_settings = Guard.NotNull(settings);
_dateTimeUtils = Guard.NotNull(dateTimeUtils);
_guidUtils = Guard.NotNull(guidUtils);
_responseMessageBuilder = Guard.NotNull(responseMessageBuilder);

_saveToFile = saveToFile;

Expand All @@ -79,7 +82,8 @@ public void RespondWith(IResponseProvider provider)
provider = new WebSocketResponseProvider(
response.WebSocketBuilder,
_guidUtils,
_dateTimeUtils
_dateTimeUtils,
_responseMessageBuilder
);
}

Expand Down
Loading
Loading