From 9b67a7cd65f5b6928e3a8742e4fa921b7694ae78 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 1 Aug 2020 19:07:09 +0200 Subject: [PATCH] HandleRequestsSynchronously --- .../Admin/Settings/SettingsModel.cs | 5 +++++ .../Owin/IWireMockMiddlewareOptions.cs | 2 ++ src/WireMock.Net/Owin/WireMockMiddleware.cs | 13 ++++++++++- .../Owin/WireMockMiddlewareOptions.cs | 3 +++ src/WireMock.Net/Server/FluentMockServer.cs | 22 +++++++++---------- .../Server/WireMockServer.Admin.cs | 8 ++++++- src/WireMock.Net/Server/WireMockServer.cs | 1 + .../Settings/IWireMockServerSettings.cs | 8 ++++++- .../Settings/WireMockServerSettings.cs | 4 ++++ .../Settings/WireMockServerSettingsParser.cs | 3 ++- 10 files changed, 54 insertions(+), 15 deletions(-) diff --git a/src/WireMock.Net.Abstractions/Admin/Settings/SettingsModel.cs b/src/WireMock.Net.Abstractions/Admin/Settings/SettingsModel.cs index 2b421d03e..2cda87b9e 100644 --- a/src/WireMock.Net.Abstractions/Admin/Settings/SettingsModel.cs +++ b/src/WireMock.Net.Abstractions/Admin/Settings/SettingsModel.cs @@ -29,5 +29,10 @@ public class SettingsModel /// Gets or sets wether to allow a body for all HTTP methods. /// public bool? AllowBodyForAllHttpMethods { get; set; } + + /// + /// Gets or sets wether to handle all requests synchronously. + /// + public bool? HandleRequestsSynchronously { get; set; } } } \ No newline at end of file diff --git a/src/WireMock.Net/Owin/IWireMockMiddlewareOptions.cs b/src/WireMock.Net/Owin/IWireMockMiddlewareOptions.cs index f1bd275e5..44f900e2f 100644 --- a/src/WireMock.Net/Owin/IWireMockMiddlewareOptions.cs +++ b/src/WireMock.Net/Owin/IWireMockMiddlewareOptions.cs @@ -45,5 +45,7 @@ internal interface IWireMockMiddlewareOptions bool? DisableJsonBodyParsing { get; set; } bool? DisableRequestBodyDecompressing { get; set; } + + bool? HandleRequestsSynchronously { get; set; } } } \ No newline at end of file diff --git a/src/WireMock.Net/Owin/WireMockMiddleware.cs b/src/WireMock.Net/Owin/WireMockMiddleware.cs index cfc708cff..2e02eba17 100644 --- a/src/WireMock.Net/Owin/WireMockMiddleware.cs +++ b/src/WireMock.Net/Owin/WireMockMiddleware.cs @@ -25,6 +25,7 @@ namespace WireMock.Owin { internal class WireMockMiddleware : OwinMiddleware { + private readonly object _lock = new object(); private static readonly Task CompletedTask = Task.FromResult(false); private readonly IWireMockMiddlewareOptions _options; private readonly IOwinRequestMapper _requestMapper; @@ -65,7 +66,17 @@ public override Task Invoke(IContext ctx) public Task Invoke(IContext ctx) #endif { - return InvokeInternal(ctx); + if (_options.HandleRequestsSynchronously.GetValueOrDefault(true)) + { + lock (_lock) + { + return InvokeInternal(ctx); + } + } + else + { + return InvokeInternal(ctx); + } } private async Task InvokeInternal(IContext ctx) diff --git a/src/WireMock.Net/Owin/WireMockMiddlewareOptions.cs b/src/WireMock.Net/Owin/WireMockMiddlewareOptions.cs index 37bbac540..c213b4fd4 100644 --- a/src/WireMock.Net/Owin/WireMockMiddlewareOptions.cs +++ b/src/WireMock.Net/Owin/WireMockMiddlewareOptions.cs @@ -51,5 +51,8 @@ internal class WireMockMiddlewareOptions : IWireMockMiddlewareOptions /// public bool? DisableRequestBodyDecompressing { get; set; } + + /// + public bool? HandleRequestsSynchronously { get; set; } } } \ No newline at end of file diff --git a/src/WireMock.Net/Server/FluentMockServer.cs b/src/WireMock.Net/Server/FluentMockServer.cs index 2e2def00b..df5deef39 100644 --- a/src/WireMock.Net/Server/FluentMockServer.cs +++ b/src/WireMock.Net/Server/FluentMockServer.cs @@ -1,13 +1,13 @@ using System; -using WireMock.Settings; - -namespace WireMock.Server -{ - [Obsolete("Use WireMockServer. This will removed in next version (1.3.x)")] - public class FluentMockServer : WireMockServer - { - public FluentMockServer(IFluentMockServerSettings settings) : base((IWireMockServerSettings) settings) - { - } - } +using WireMock.Settings; + +namespace WireMock.Server +{ + [Obsolete("Use WireMockServer. This will removed in next version (1.3.x)")] + public class FluentMockServer : WireMockServer + { + public FluentMockServer(IFluentMockServerSettings settings) : base((IWireMockServerSettings) settings) + { + } + } } \ No newline at end of file diff --git a/src/WireMock.Net/Server/WireMockServer.Admin.cs b/src/WireMock.Net/Server/WireMockServer.Admin.cs index 85d832d5f..3432da978 100644 --- a/src/WireMock.Net/Server/WireMockServer.Admin.cs +++ b/src/WireMock.Net/Server/WireMockServer.Admin.cs @@ -344,7 +344,8 @@ private ResponseMessage SettingsGet(RequestMessage requestMessage) MaxRequestLogCount = _options.MaxRequestLogCount, RequestLogExpirationDuration = _options.RequestLogExpirationDuration, GlobalProcessingDelay = (int?)_options.RequestProcessingDelay?.TotalMilliseconds, - AllowBodyForAllHttpMethods = _options.AllowBodyForAllHttpMethods + AllowBodyForAllHttpMethods = _options.AllowBodyForAllHttpMethods, + HandleRequestsSynchronously = _options.HandleRequestsSynchronously }; return ToJson(model); @@ -371,6 +372,11 @@ private ResponseMessage SettingsUpdate(RequestMessage requestMessage) _options.AllowBodyForAllHttpMethods = settings.AllowBodyForAllHttpMethods.Value; } + if (settings.HandleRequestsSynchronously != null) + { + _options.HandleRequestsSynchronously = settings.HandleRequestsSynchronously.Value; + } + return ResponseMessageBuilder.Create("Settings updated"); } #endregion Settings diff --git a/src/WireMock.Net/Server/WireMockServer.cs b/src/WireMock.Net/Server/WireMockServer.cs index 3baeeac17..ffb878341 100644 --- a/src/WireMock.Net/Server/WireMockServer.cs +++ b/src/WireMock.Net/Server/WireMockServer.cs @@ -217,6 +217,7 @@ protected WireMockServer(IWireMockServerSettings settings) _options.PostWireMockMiddlewareInit = _settings.PostWireMockMiddlewareInit; _options.Logger = _settings.Logger; _options.DisableJsonBodyParsing = _settings.DisableJsonBodyParsing; + _options.HandleRequestsSynchronously = settings.HandleRequestsSynchronously; _matcherMapper = new MatcherMapper(_settings); _mappingConverter = new MappingConverter(_matcherMapper); diff --git a/src/WireMock.Net/Settings/IWireMockServerSettings.cs b/src/WireMock.Net/Settings/IWireMockServerSettings.cs index 843b8729e..0d3ffd884 100644 --- a/src/WireMock.Net/Settings/IWireMockServerSettings.cs +++ b/src/WireMock.Net/Settings/IWireMockServerSettings.cs @@ -143,7 +143,7 @@ public interface IWireMockServerSettings /// - false : also null, 0, empty or invalid HttpStatus codes are allowed. /// - true : only codes defined in are allowed. /// - /// [PublicAPI] + [PublicAPI] bool? AllowOnlyDefinedHttpStatusCodeInResponse { get; set; } /// @@ -157,5 +157,11 @@ public interface IWireMockServerSettings /// [PublicAPI] bool? DisableRequestBodyDecompressing { get; set; } + + /// + /// Handle all requests synchronously. (default set to false). + /// + [PublicAPI] + bool? HandleRequestsSynchronously { get; set; } } } \ No newline at end of file diff --git a/src/WireMock.Net/Settings/WireMockServerSettings.cs b/src/WireMock.Net/Settings/WireMockServerSettings.cs index f7c327362..02a60d6a3 100644 --- a/src/WireMock.Net/Settings/WireMockServerSettings.cs +++ b/src/WireMock.Net/Settings/WireMockServerSettings.cs @@ -113,5 +113,9 @@ public class WireMockServerSettings : IWireMockServerSettings /// [PublicAPI] public bool? DisableRequestBodyDecompressing { get; set; } + + /// + [PublicAPI] + public bool? HandleRequestsSynchronously { get; set; } } } \ No newline at end of file diff --git a/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs b/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs index 62aa48ce3..366f11044 100644 --- a/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs +++ b/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs @@ -36,7 +36,8 @@ public static IWireMockServerSettings ParseArguments([NotNull] string[] args, [C AllowCSharpCodeMatcher = parser.GetBoolValue("AllowCSharpCodeMatcher"), AllowBodyForAllHttpMethods = parser.GetBoolValue("AllowBodyForAllHttpMethods"), AllowOnlyDefinedHttpStatusCodeInResponse = parser.GetBoolValue("AllowOnlyDefinedHttpStatusCodeInResponse"), - DisableJsonBodyParsing = parser.GetBoolValue("DisableJsonBodyParsing") + DisableJsonBodyParsing = parser.GetBoolValue("DisableJsonBodyParsing"), + HandleRequestsSynchronously = parser.GetBoolValue("HandleRequestsSynchronously") }; if (logger != null)