diff --git a/WireMock.Net Solution.sln b/WireMock.Net Solution.sln index 4c4c8359..2c33ac69 100644 --- a/WireMock.Net Solution.sln +++ b/WireMock.Net Solution.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.27004.2005 +VisualStudioVersion = 15.0.27004.2010 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{EF242EDF-7133-4277-9A0C-18744DE08707}" EndProject @@ -39,7 +39,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.StandAlone.Net {B6269AAC-170A-43D5-8B9A-579DED3D9A95} = {B6269AAC-170A-43D5-8B9A-579DED3D9A95} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.ConsoleApplication", "examples\WireMock.Net.ConsoleApplication\WireMock.Net.ConsoleApplication.csproj", "{668F689E-57B4-422E-8846-C0FF643CA268}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.Console.NET452", "examples\WireMock.Net.ConsoleApplication\WireMock.Net.Console.NET452.csproj", "{668F689E-57B4-422E-8846-C0FF643CA268}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/appveyor.yml b/appveyor.yml index 9810f265..6ab59af5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -21,7 +21,6 @@ environment: before_build: - dotnet restore .\src\WireMock.Net\WireMock.Net.csproj - dotnet restore .\src\WireMock.Net.Standalone\WireMock.Net.Standalone.csproj -- nuget restore .\examples\WireMock.Net.ConsoleApplication\WireMock.Net.ConsoleApplication.csproj -PackagesDirectory packages build_script: # build WireMock.Net diff --git a/examples/WireMock.Net.ConsoleApplication/MainApp.cs b/examples/WireMock.Net.ConsoleApplication/MainApp.cs index 8f002d98..b7db6ac7 100644 --- a/examples/WireMock.Net.ConsoleApplication/MainApp.cs +++ b/examples/WireMock.Net.ConsoleApplication/MainApp.cs @@ -21,6 +21,10 @@ namespace WireMock.Net.ConsoleApplication Urls = new[] { url1, url2, url3 }, StartAdminInterface = true, ReadStaticMappings = true, + //ProxyAndRecordSettings = new ProxyAndRecordSettings + //{ + // SaveMapping = true + //}, PreWireMockMiddlewareInit = app => { System.Console.WriteLine($"PreWireMockMiddlewareInit : {app.GetType()}"); }, PostWireMockMiddlewareInit = app => { System.Console.WriteLine($"PostWireMockMiddlewareInit : {app.GetType()}"); } }); @@ -30,6 +34,12 @@ namespace WireMock.Net.ConsoleApplication // server.AllowPartialMapping(); + // .WithHeader("Stef", "Stef") + //server + // .Given(Request.Create().WithPath("*")) + // .RespondWith(Response.Create() + // .WithProxy("http://restcountries.eu")); + server .Given(Request.Create().WithPath("/headers", "/headers_test").UsingPost().WithHeader("Content-Type", "application/json*")) .RespondWith(Response.Create() diff --git a/examples/WireMock.Net.ConsoleApplication/WireMock.Net.ConsoleApplication.csproj b/examples/WireMock.Net.ConsoleApplication/WireMock.Net.Console.NET452.csproj similarity index 100% rename from examples/WireMock.Net.ConsoleApplication/WireMock.Net.ConsoleApplication.csproj rename to examples/WireMock.Net.ConsoleApplication/WireMock.Net.Console.NET452.csproj diff --git a/src/WireMock.Net/Owin/GlobalExceptionMiddleware.cs b/src/WireMock.Net/Owin/GlobalExceptionMiddleware.cs index 0769ebff..faf275ac 100644 --- a/src/WireMock.Net/Owin/GlobalExceptionMiddleware.cs +++ b/src/WireMock.Net/Owin/GlobalExceptionMiddleware.cs @@ -25,10 +25,10 @@ namespace WireMock.Owin #endif #if NETSTANDARD - public RequestDelegate Next { get; private set; } + public RequestDelegate Next { get; } #endif - private readonly OwinResponseMapper _responseMapper = new OwinResponseMapper(); + private readonly OwinResponseMapper _responseMapper = new OwinResponseMapper(); #if !NETSTANDARD public override async Task Invoke(IOwinContext ctx) diff --git a/src/WireMock.Net/Owin/OwinResponseMapper.cs b/src/WireMock.Net/Owin/OwinResponseMapper.cs index 87cebb0d..c9985299 100644 --- a/src/WireMock.Net/Owin/OwinResponseMapper.cs +++ b/src/WireMock.Net/Owin/OwinResponseMapper.cs @@ -1,8 +1,10 @@ -using System.IO; +using System; +using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; -using WireMock.Http; +using WireMock.Util; #if !NETSTANDARD using Microsoft.Owin; #else @@ -18,6 +20,19 @@ namespace WireMock.Owin { private readonly Encoding _utf8NoBom = new UTF8Encoding(false); + // https://stackoverflow.com/questions/239725/cannot-set-some-http-headers-when-using-system-net-webrequest +#if !NETSTANDARD + private static readonly IDictionary>> RestrictedResponseHeaders = new Dictionary>>(StringComparer.OrdinalIgnoreCase) { +#else + private static readonly IDictionary>> RestrictedResponseHeaders = new Dictionary>>(StringComparer.OrdinalIgnoreCase) { +#endif + { "Content-Length", null }, + { "Content-Type", (r, v) => r.ContentType = v.FirstOrDefault() }, + { "Keep-Alive", null }, + { "Transfer-Encoding", null }, + { "WWW-Authenticate", null } + }; + /// /// MapAsync ResponseMessage to OwinResponse /// @@ -33,18 +48,22 @@ namespace WireMock.Owin { response.StatusCode = responseMessage.StatusCode; - if (responseMessage.Headers.ContainsKey(HttpKnownHeaderNames.ContentType)) + // Set headers + foreach (var pair in responseMessage.Headers) { - response.ContentType = responseMessage.Headers[HttpKnownHeaderNames.ContentType].FirstOrDefault(); - } - - var headers = responseMessage.Headers.Where(h => h.Key != HttpKnownHeaderNames.ContentType).ToList(); - + if (RestrictedResponseHeaders.ContainsKey(pair.Key)) + { + RestrictedResponseHeaders[pair.Key]?.Invoke(response, pair.Value); + } + else + { #if !NETSTANDARD - headers.ForEach(pair => response.Headers.AppendValues(pair.Key, pair.Value.ToArray())); + response.Headers.AppendValues(pair.Key, pair.Value.ToArray()); #else - headers.ForEach(pair => response.Headers.Append(pair.Key, pair.Value.ToArray())); + response.Headers.Append(pair.Key, pair.Value.ToArray()); #endif + } + } if (responseMessage.Body == null && responseMessage.BodyAsBytes == null && responseMessage.BodyAsFile == null) { diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index 34db3f53..05cf7b2c 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -20,7 +20,7 @@ namespace WireMock.ResponseBuilders /// public class Response : IResponseBuilder { - private HttpClient httpClientForProxy; + private HttpClient _httpClientForProxy; /// /// The delay @@ -274,35 +274,23 @@ namespace WireMock.ResponseBuilders return this; } - /// - /// The with transformer. - /// - /// - /// The . - /// + /// public IResponseBuilder WithTransformer() { UseTransformer = true; return this; } - /// - /// The with delay. - /// - /// The TimeSpan to delay. - /// The . + /// public IResponseBuilder WithDelay(TimeSpan delay) { Check.Condition(delay, d => d > TimeSpan.Zero, nameof(delay)); + Delay = delay; return this; } - /// - /// The with delay. - /// - /// The milliseconds to delay. - /// The . + /// public IResponseBuilder WithDelay(int milliseconds) { return WithDelay(TimeSpan.FromMilliseconds(milliseconds)); @@ -320,7 +308,7 @@ namespace WireMock.ResponseBuilders ProxyUrl = proxyUrl; X509Certificate2ThumbprintOrSubjectName = clientX509Certificate2ThumbprintOrSubjectName; - httpClientForProxy = HttpClientHelper.CreateHttpClient(clientX509Certificate2ThumbprintOrSubjectName); + _httpClientForProxy = HttpClientHelper.CreateHttpClient(clientX509Certificate2ThumbprintOrSubjectName); return this; } @@ -334,14 +322,17 @@ namespace WireMock.ResponseBuilders Check.NotNull(requestMessage, nameof(requestMessage)); if (Delay != null) + { await Task.Delay(Delay.Value); + } - if (ProxyUrl != null && httpClientForProxy != null) + if (ProxyUrl != null && _httpClientForProxy != null) { var requestUri = new Uri(requestMessage.Url); var proxyUri = new Uri(ProxyUrl); var proxyUriWithRequestPathAndQuery = new Uri(proxyUri, requestUri.PathAndQuery); - return await HttpClientHelper.SendAsync(httpClientForProxy, requestMessage, proxyUriWithRequestPathAndQuery.AbsoluteUri); + + return await HttpClientHelper.SendAsync(_httpClientForProxy, requestMessage, proxyUriWithRequestPathAndQuery.AbsoluteUri); } if (UseTransformer)