diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index 580786690..a960b727a 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -21,6 +21,10 @@ jobs: script: | $jdkPath = $env:JAVA_HOME_11_X64 Write-Host "##vso[task.setvariable variable=JAVA_HOME]$jdkPath" + + - script: | + dotnet dev-certs https --trust || true + displayName: 'dotnet dev-certs https' - task: SonarCloudPrepare@1 displayName: 'Prepare analysis on SonarCloud' diff --git a/examples/WireMock.Net.StandAlone.NETCoreApp/Program.cs b/examples/WireMock.Net.StandAlone.NETCoreApp/Program.cs index 5ccabe7ba..6d4571606 100644 --- a/examples/WireMock.Net.StandAlone.NETCoreApp/Program.cs +++ b/examples/WireMock.Net.StandAlone.NETCoreApp/Program.cs @@ -6,6 +6,8 @@ using log4net; using log4net.Config; using log4net.Repository; +using WireMock.RequestBuilders; +using WireMock.ResponseBuilders; using WireMock.Server; using WireMock.Settings; @@ -23,15 +25,21 @@ static void Main(string[] args) { XmlConfigurator.Configure(LogRepository, new FileInfo("log4net.config")); - if (WireMockServerSettingsParser.TryParseArguments(args, out var settings, new WireMockLog4NetLogger())) + if (!WireMockServerSettingsParser.TryParseArguments(args, out var settings, new WireMockLog4NetLogger())) { return; - } - + } + settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); _server = WireMockServer.Start(settings); + //_server + // .Given(Request.Create() + // .UsingAnyMethod()) + // .RespondWith(Response.Create() + // .WithProxy("https://www.google.com")); + Console.WriteLine($"{DateTime.UtcNow} Press Ctrl+C to shut down"); Console.CancelKeyPress += (s, e) => diff --git a/examples/WireMock.Net.StandAlone.NETCoreApp/Properties/launchSettings.json b/examples/WireMock.Net.StandAlone.NETCoreApp/Properties/launchSettings.json index 2386987ae..89c5b6b82 100644 --- a/examples/WireMock.Net.StandAlone.NETCoreApp/Properties/launchSettings.json +++ b/examples/WireMock.Net.StandAlone.NETCoreApp/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "WireMock.Net.StandAlone.NETCoreApp": { "commandName": "Project", - "commandLineArgs": "--Port 9091 --WireMockLogger WireMockConsoleLogger" + "commandLineArgs": "--Urls https://localhost:10080 --WireMockLogger WireMockConsoleLogger" } } } \ No newline at end of file diff --git a/examples/WireMock.Net.StandAlone.NETCoreApp/WireMock.Net.StandAlone.NETCoreApp.csproj b/examples/WireMock.Net.StandAlone.NETCoreApp/WireMock.Net.StandAlone.NETCoreApp.csproj index 4a53e8f5c..ad2aba189 100644 --- a/examples/WireMock.Net.StandAlone.NETCoreApp/WireMock.Net.StandAlone.NETCoreApp.csproj +++ b/examples/WireMock.Net.StandAlone.NETCoreApp/WireMock.Net.StandAlone.NETCoreApp.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.1 + netcoreapp3.1 ../../WireMock.Net-Logo.ico WireMock.Net.StandAlone.NETCoreApp.Program diff --git a/examples/WireMock.Net.StandAlone.NETCoreApp/run10.cmd b/examples/WireMock.Net.StandAlone.NETCoreApp/run10.cmd deleted file mode 100644 index 53bd1ff57..000000000 --- a/examples/WireMock.Net.StandAlone.NETCoreApp/run10.cmd +++ /dev/null @@ -1 +0,0 @@ -dotnet run --framework netcoreapp1.1 \ No newline at end of file diff --git a/examples/WireMock.Net.StandAlone.NETCoreApp/run20.cmd b/examples/WireMock.Net.StandAlone.NETCoreApp/run20.cmd deleted file mode 100644 index ce2e3e048..000000000 --- a/examples/WireMock.Net.StandAlone.NETCoreApp/run20.cmd +++ /dev/null @@ -1 +0,0 @@ -dotnet run --framework netcoreapp2.0 \ No newline at end of file diff --git a/examples/WireMock.Net.StandAlone.NETCoreApp/run21.cmd b/examples/WireMock.Net.StandAlone.NETCoreApp/run21.cmd deleted file mode 100644 index 8dd3a9bb1..000000000 --- a/examples/WireMock.Net.StandAlone.NETCoreApp/run21.cmd +++ /dev/null @@ -1 +0,0 @@ -dotnet run --framework netcoreapp2.1 \ No newline at end of file diff --git a/src/WireMock.Net/Http/HttpClientHelper.cs b/src/WireMock.Net/Http/HttpClientHelper.cs index d116cdd0a..76247d61b 100644 --- a/src/WireMock.Net/Http/HttpClientHelper.cs +++ b/src/WireMock.Net/Http/HttpClientHelper.cs @@ -27,14 +27,12 @@ public static HttpClient CreateHttpClient(IProxyAndRecordSettings settings) ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; - ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11; #else var handler = new WebRequestHandler { ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; - ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11; #endif if (!string.IsNullOrEmpty(settings.ClientX509Certificate2ThumbprintOrSubjectName)) @@ -59,13 +57,14 @@ public static HttpClient CreateHttpClient(IProxyAndRecordSettings settings) { handler.Proxy.Credentials = new NetworkCredential(settings.WebProxySettings.UserName, settings.WebProxySettings.Password); } - } - - var client = new HttpClient(handler); -#if NET452 || NET46 + } + +#if !NETSTANDARD1_3 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; + ServicePointManager.ServerCertificateValidationCallback = (message, cert, chain, errors) => true; #endif - return client; + + return new HttpClient(handler); } public static async Task SendAsync([NotNull] HttpClient client, [NotNull] RequestMessage requestMessage, string url, bool deserializeJson, bool decompressGzipAndDeflate) diff --git a/src/WireMock.Net/Http/HttpRequestMessageHelper.cs b/src/WireMock.Net/Http/HttpRequestMessageHelper.cs index 2f2005d3f..b437e6da0 100644 --- a/src/WireMock.Net/Http/HttpRequestMessageHelper.cs +++ b/src/WireMock.Net/Http/HttpRequestMessageHelper.cs @@ -59,15 +59,29 @@ internal static HttpRequestMessage Create([NotNull] RequestMessage requestMessag foreach (var header in requestMessage.Headers.Where(h => !excludeHeaders.Contains(h.Key, StringComparer.OrdinalIgnoreCase))) { - // Try to add to request headers. If failed - try to add to content headers - if (httpRequestMessage.Headers.Contains(header.Key)) + // Skip if already added. We need to ToList() else calling httpRequestMessage.Headers.Contains() with a header starting with a ":" throws an exception. + if (httpRequestMessage.Headers.ToList().Any(h => string.Equals(h.Key, header.Key, StringComparison.OrdinalIgnoreCase))) { continue; } - if (!httpRequestMessage.Headers.TryAddWithoutValidation(header.Key, header.Value)) + // Skip if already added. We need to ToList() else calling httpRequestMessage.Content.Headers.Contains(...) with a header starting with a ":" throws an exception. + if (httpRequestMessage.Content != null && httpRequestMessage.Content.Headers.ToList().Any(h => string.Equals(h.Key, header.Key, StringComparison.OrdinalIgnoreCase))) { - httpRequestMessage.Content.Headers.TryAddWithoutValidation(header.Key, header.Value); + continue; + } + + // Try to add to request headers. If failed - try to add to content headers. If still fails, just ignore this header. + try + { + if (!httpRequestMessage.Headers.TryAddWithoutValidation(header.Key, header.Value)) + { + httpRequestMessage.Content?.Headers.TryAddWithoutValidation(header.Key, header.Value); + } + } + catch + { + // Just continue } } diff --git a/test/WireMock.Net.Tests/WireMockServer.Proxy.cs b/test/WireMock.Net.Tests/WireMockServer.Proxy.cs index 6bbc68b6c..342e17ad5 100644 --- a/test/WireMock.Net.Tests/WireMockServer.Proxy.cs +++ b/test/WireMock.Net.Tests/WireMockServer.Proxy.cs @@ -8,7 +8,6 @@ using FluentAssertions; using NFluent; using WireMock.Admin.Mappings; -using WireMock.Logging; using WireMock.Matchers.Request; using WireMock.RequestBuilders; using WireMock.ResponseBuilders; @@ -20,6 +19,37 @@ namespace WireMock.Net.Tests { public class WireMockServerProxyTests { + [Fact(Skip = "Fails in Linux CI")] + public async Task WireMockServer_ProxySSL_Should_log_proxied_requests() + { + // Assign + var settings = new WireMockServerSettings + { + UseSSL = true, + ProxyAndRecordSettings = new ProxyAndRecordSettings + { + Url = "https://www.google.com", + SaveMapping = true, + SaveMappingToFile = false + } + + }; + var server = WireMockServer.Start(settings); + + // Act + var requestMessage = new HttpRequestMessage + { + Method = HttpMethod.Get, + RequestUri = new Uri(server.Urls[0]) + }; + var httpClientHandler = new HttpClientHandler { AllowAutoRedirect = false }; + await new HttpClient(httpClientHandler).SendAsync(requestMessage); + + // Assert + Check.That(server.Mappings).HasSize(2); + Check.That(server.LogEntries).HasSize(1); + } + [Fact] public async Task WireMockServer_Proxy_Should_log_proxied_requests() {