From a8934ec7f917a4d878238a289abd134f1ea0a745 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Fri, 17 Apr 2020 12:18:45 +0200 Subject: [PATCH] fix net452 (#454) --- .../MainApp.cs | 1081 +++++++++-------- src/WireMock.Net/Owin/HostUrlOptions.cs | 84 +- 2 files changed, 584 insertions(+), 581 deletions(-) diff --git a/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs b/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs index 2b92c007..1c590629 100644 --- a/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs +++ b/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs @@ -1,540 +1,543 @@ -using Newtonsoft.Json; -using HandlebarsDotNet; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Net; -using WireMock.Logging; -using WireMock.Matchers; -using WireMock.RequestBuilders; -using WireMock.ResponseBuilders; -using WireMock.Server; -using WireMock.Settings; -using WireMock.Util; - -namespace WireMock.Net.ConsoleApplication -{ - public interface IHandleBarTransformer - { - string Name { get; } - - void Render(TextWriter textWriter, dynamic context, object[] arguments); - } - - public class CustomNameTransformer : IHandleBarTransformer - { - public string Name => "CustomName"; - - public void Render(TextWriter writer, dynamic context, object[] parameters) - { - /* Handlebar logic to render */ - } - } - - public static class MainApp - { - public static void Run() - { - string url1 = "http://localhost:9091/"; - string url2 = "http://localhost:9092/"; - string url3 = "https://localhost:9443/"; - - var server = WireMockServer.Start(new WireMockServerSettings - { - AllowCSharpCodeMatcher = true, - Urls = new[] { url1, url2, url3 }, - StartAdminInterface = true, - ReadStaticMappings = true, - WatchStaticMappings = true, - WatchStaticMappingsInSubdirectories = true, - //ProxyAndRecordSettings = new ProxyAndRecordSettings - //{ - // SaveMapping = true - //}, - PreWireMockMiddlewareInit = app => { System.Console.WriteLine($"PreWireMockMiddlewareInit : {app.GetType()}"); }, - PostWireMockMiddlewareInit = app => { System.Console.WriteLine($"PostWireMockMiddlewareInit : {app.GetType()}"); }, - Logger = new WireMockConsoleLogger(), - - HandlebarsRegistrationCallback = (handlebarsContext, fileSystemHandler) => - { - var transformer = new CustomNameTransformer(); - handlebarsContext.RegisterHelper(transformer.Name, transformer.Render); - }, - - // Uncomment below if you want to use the CustomFileSystemFileHandler - // FileSystemHandler = new CustomFileSystemFileHandler() - }); - System.Console.WriteLine("WireMockServer listening at {0}", string.Join(",", server.Urls)); - - server.SetBasicAuthentication("a", "b"); - - // server.AllowPartialMapping(); - - server - .Given(Request.Create().WithPath(p => p.Contains("x")).UsingGet()) - .AtPriority(4) - .RespondWith(Response.Create() - .WithStatusCode(200) - .WithHeader("Content-Type", "application/json") - .WithBody(@"{ ""result"": ""Contains x with FUNC 200""}")); - - server - .Given(Request.Create() - .UsingGet() - .WithPath("/proxy-test-keep-alive") - ) - .RespondWith(Response.Create() - .WithHeader("Keep-Alive", "timeout=1, max=1") - ); - - server - .Given(Request.Create() - .UsingPost() - .WithHeader("postmanecho", "post") - ) - .RespondWith(Response.Create() - .WithProxy(new ProxyAndRecordSettings { Url = "http://postman-echo.com/post" }) - ); - - server - .Given(Request.Create() - .UsingGet() - .WithHeader("postmanecho", "get") - ) - .RespondWith(Response.Create() - .WithProxy(new ProxyAndRecordSettings { Url = "http://postman-echo.com/get" }) - ); - - server - .Given(Request.Create() - .UsingGet() - .WithHeader("postmanecho", "get2") - ) - .RespondWith(Response.Create() - .WithProxy(new ProxyAndRecordSettings - { - Url = "http://postman-echo.com/get", - WebProxySettings = new WebProxySettings - { - Address = "http://company", - UserName = "test", - Password = "pwd" - } - }) - ); - - server - .Given(Request.Create() - .UsingGet() - .WithPath("/proxy-execute-keep-alive") - ) - .RespondWith(Response.Create() - .WithProxy(new ProxyAndRecordSettings { Url = "http://localhost:9999", BlackListedHeaders = new[] { "Keep-Alive" } }) - .WithHeader("Keep-Alive-Test", "stef") - ); - - server - .Given(Request.Create() - .WithPath("/xpath").UsingPost() - .WithBody(new XPathMatcher("/todo-list[count(todo-item) = 3]")) - ) - .RespondWith(Response.Create().WithBody("XPathMatcher!")); - - server - .Given(Request.Create() - .WithPath("/xpaths").UsingPost() - .WithBody(new[] { new XPathMatcher("/todo-list[count(todo-item) = 3]"), new XPathMatcher("/todo-list[count(todo-item) = 4]") }) - ) - .RespondWith(Response.Create().WithBody("xpaths!")); - - server - .Given(Request - .Create() - .WithPath("/jsonthings") - .WithBody(new JsonPathMatcher("$.things[?(@.name == 'RequiredThing')]")) - .UsingPut()) - .RespondWith(Response.Create() - .WithBody(@"{ ""result"": ""JsonPathMatcher !!!""}")); - - server - .Given(Request - .Create() - .WithPath("/jsonbodytest1") - .WithBody(new JsonMatcher("{ \"x\": 42, \"s\": \"s\" }")) - .UsingPost()) - .WithGuid("debaf408-3b23-4c04-9d18-ef1c020e79f2") - .RespondWith(Response.Create() - .WithBody(@"{ ""result"": ""jsonbodytest1"" }")); - - server - .Given(Request - .Create() - .WithPath("/jsonbodytest2") - .WithBody(new JsonMatcher(new { x = 42, s = "s" })) - .UsingPost()) - .WithGuid("debaf408-3b23-4c04-9d18-ef1c020e79f3") - .RespondWith(Response.Create() - .WithBody(@"{ ""result"": ""jsonbodytest2"" }")); - - server - .Given(Request - .Create() - .WithPath(new WildcardMatcher("/navision/OData/Company('My Company')/School*", true)) - .WithParam("$filter", "(substringof(Code, 'WA')") - .UsingGet()) - .RespondWith(Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBody(@"{ ""result"": ""odata""}")); - - server - .Given(Request - .Create() - .WithPath(new WildcardMatcher("/param2", true)) - .WithParam("key", "test") - .UsingGet()) - .RespondWith(Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { result = "param2" })); - - server - .Given(Request - .Create() - .WithPath(new WildcardMatcher("/param3", true)) - .WithParam("key", new WildcardMatcher("t*")) - .UsingGet()) - .RespondWith(Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { result = "param3" })); - - server - .Given(Request.Create().WithPath("/headers", "/headers_test").UsingPost().WithHeader("Content-Type", "application/json*")) - .RespondWith(Response.Create() - .WithStatusCode(201) - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { result = "data:headers posted with 201" })); - - if (!System.IO.File.Exists(@"c:\temp\x.json")) - { - System.IO.File.WriteAllText(@"c:\temp\x.json", "{ \"hello\": \"world\", \"answer\": 42 }"); - } - - server - .Given(Request.Create().WithPath("/file").UsingGet()) - .RespondWith(Response.Create() - .WithBodyFromFile(@"c:\temp\x.json", false) - ); - - server - .Given(Request.Create().WithPath("/filecache").UsingGet()) - .RespondWith(Response.Create() - .WithBodyFromFile(@"c:\temp\x.json") - ); - - server - .Given(Request.Create().WithPath("/file_rel").UsingGet()) - .WithGuid("0000aaaa-fcf4-4256-a0d3-1c76e4862947") - .RespondWith(Response.Create() - .WithHeader("Content-Type", "application/xml") - .WithBodyFromFile("WireMock.Net.xml", false) - ); - - server - .Given(Request.Create().WithHeader("ProxyThis", "true") - .UsingGet()) - .RespondWith(Response.Create() - .WithProxy("http://www.google.com") - ); - - server - .Given(Request.Create().WithPath("/bodyasbytes.png") - .UsingGet()) - .RespondWith(Response.Create() - .WithHeader("Content-Type", "image/png") - .WithBody(Convert.FromBase64String("iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTczbp9jAAAAJ0lEQVQoU2NgUPuPD6Hz0RCEAtJoiAxpCCBXGgmRIo0TofORkdp/AMiMdRVnV6O0AAAAAElFTkSuQmCC")) - ); - - server - .Given(Request.Create().WithPath("/oauth2/access").UsingPost().WithBody("grant_type=password;username=u;password=p")) - .RespondWith(Response.Create() - .WithStatusCode(200) - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { access_token = "AT", refresh_token = "RT" })); - - server - .Given(Request.Create().WithPath("/helloworld").UsingGet().WithHeader("Authorization", new RegexMatcher("^(?i)Bearer AT$"))) - .RespondWith(Response.Create() - .WithStatusCode(200) - .WithBody("hi")); - - server - .Given(Request.Create().WithPath("/data").UsingPost().WithBody(b => b.Contains("e"))) - .AtPriority(999) - .RespondWith(Response.Create() - .WithStatusCode(201) - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { result = "data posted with FUNC 201" })); - - server - .Given(Request.Create().WithPath("/json").UsingPost().WithBody(new JsonPathMatcher("$.things[?(@.name == 'RequiredThing')]"))) - .RespondWith(Response.Create() - .WithStatusCode(201) - .WithHeader("Content-Type", "application/json") - .WithBody(@"{ ""result"": ""json posted with 201""}")); - - server - .Given(Request.Create().WithPath("/json2").UsingPost().WithBody("x")) - .RespondWith(Response.Create() - .WithStatusCode(201) - .WithHeader("Content-Type", "application/json") - .WithBody(@"{ ""result"": ""json posted with x - 201""}")); - - server - .Given(Request.Create().WithPath("/data").UsingDelete()) - .RespondWith(Response.Create() - .WithStatusCode(200) - .WithHeader("Content-Type", "application/json") - .WithBody(@"{ ""result"": ""data deleted with 200""}")); - - server - .Given(Request.Create() - .WithPath("/needs-a-key") - .UsingGet() - .WithHeader("api-key", "*", MatchBehaviour.AcceptOnMatch) - .UsingAnyMethod()) - .RespondWith(Response.Create() - .WithStatusCode(HttpStatusCode.OK) - .WithBody(@"{ ""result"": ""api-key found""}")); - - server - .Given(Request.Create() - .WithPath("/needs-a-key") - .UsingGet() - .WithHeader("api-key", "*", MatchBehaviour.RejectOnMatch) - .UsingAnyMethod()) - .RespondWith(Response.Create() - .WithStatusCode(HttpStatusCode.Unauthorized) - .WithBody(@"{ ""result"": ""api-key missing""}")); - - server - .Given(Request.Create().WithPath("/nobody").UsingGet()) - .RespondWith(Response.Create().WithDelay(TimeSpan.FromSeconds(1)) - .WithStatusCode(200)); - - server - .Given(Request.Create().WithPath("/partial").UsingPost().WithBody(new SimMetricsMatcher(new[] { "cat", "dog" }))) - .RespondWith(Response.Create().WithStatusCode(200).WithBody("partial = 200")); - - // http://localhost:8080/trans?start=1000&stop=1&stop=2 - server - .Given(Request.Create().WithPath("/trans").UsingGet()) - .WithGuid("90356dba-b36c-469a-a17e-669cd84f1f05") - .RespondWith(Response.Create() - .WithStatusCode(200) - .WithHeader("Content-Type", "application/json") - .WithHeader("Transformed-Postman-Token", "token is {{request.headers.Postman-Token}}") - .WithHeader("xyz_{{request.headers.Postman-Token}}", "token is {{request.headers.Postman-Token}}") - .WithBody(@"{""msg"": ""Hello world CATCH-ALL on /*, {{request.path}}, bykey={{request.query.start}}, bykey={{request.query.stop}}, byidx0={{request.query.stop.[0]}}, byidx1={{request.query.stop.[1]}}"" }") - .WithTransformer() - .WithDelay(TimeSpan.FromMilliseconds(100)) - ); - - server - .Given(Request.Create().WithPath("/jsonpathtestToken").UsingPost()) - .RespondWith(Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBody("{{JsonPath.SelectToken request.body \"$.Manufacturers[?(@.Name == 'Acme Co')]\"}}") - .WithTransformer() - ); - - server - .Given(Request.Create().WithPath("/zubinix").UsingPost()) - .RespondWith(Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBody("{ \"result\": \"{{JsonPath.SelectToken request.bodyAsJson \"username\"}}\" }") - .WithTransformer() - ); - - server - .Given(Request.Create().WithPath("/zubinix2").UsingPost()) - .RespondWith(Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { path = "{{request.path}}", result = "{{JsonPath.SelectToken request.bodyAsJson \"username\"}}" }) - .WithTransformer() - ); - - server - .Given(Request.Create().WithPath("/jsonpathtestTokenJson").UsingPost()) - .RespondWith(Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { status = "OK", url = "{{request.url}}", transformed = "{{JsonPath.SelectToken request.body \"$.Manufacturers[?(@.Name == 'Acme Co')]\"}}" }) - .WithTransformer() - ); - - server - .Given(Request.Create().WithPath("/jsonpathtestTokens").UsingPost()) - .RespondWith(Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBody("[{{#JsonPath.SelectTokens request.body \"$..Products[?(@.Price >= 50)].Name\"}} { \"idx\":{{id}}, \"value\":\"{{value}}\" }, {{/JsonPath.SelectTokens}} {} ]") - .WithTransformer() - ); - - server - .Given(Request.Create() - .WithPath("/state1") - .UsingGet()) - .InScenario("s1") - .WillSetStateTo("Test state 1") - .RespondWith(Response.Create() - .WithBody("No state msg 1")); - - server - .Given(Request.Create() - .WithPath("/foostate1") - .UsingGet()) - .InScenario("s1") - .WhenStateIs("Test state 1") - .RespondWith(Response.Create() - .WithBody("Test state msg 1")); - - server - .Given(Request.Create() - .WithPath("/state2") - .UsingGet()) - .InScenario("s2") - .WillSetStateTo("Test state 2") - .RespondWith(Response.Create() - .WithBody("No state msg 2")); - - server - .Given(Request.Create() - .WithPath("/foostate2") - .UsingGet()) - .InScenario("s2") - .WhenStateIs("Test state 2") - .RespondWith(Response.Create() - .WithBody("Test state msg 2")); - - server - .Given(Request.Create().WithPath("/encoded-test/a%20b")) - .RespondWith(Response.Create() - .WithBody("EncodedTest 1 : Path={{request.path}}, Url={{request.url}}") - .WithTransformer() - ); - - server - .Given(Request.Create().WithPath("/encoded-test/a b")) - .RespondWith(Response.Create() - .WithBody("EncodedTest 2 : Path={{request.path}}, Url={{request.url}}") - .WithTransformer() - ); - - // https://stackoverflow.com/questions/51985089/wiremock-request-matching-with-comparison-between-two-query-parameters - server - .Given(Request.Create().WithPath("/linq") - .WithParam("from", new LinqMatcher("DateTime.Parse(it) > \"2018-03-01 00:00:00\""))) - .RespondWith(Response.Create() - .WithBody("linq match !!!") - ); - - server - .Given(Request.Create().WithPath("/myendpoint").UsingAnyMethod()) - .RespondWith(Response.Create() - .WithStatusCode(500) - .WithBody(requestMessage => - { - return JsonConvert.SerializeObject(new - { - Message = "Test error" - }); - }) - ); - - server - .Given(Request.Create().WithPath("/random")) - .RespondWith(Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new - { - Xeger1 = "{{Xeger \"\\w{4}\\d{5}\"}}", - Xeger2 = "{{Xeger \"\\d{5}\"}}", - TextRegexPostcode = "{{Random Type=\"TextRegex\" Pattern=\"[1-9][0-9]{3}[A-Z]{2}\"}}", - Text = "{{Random Type=\"Text\" Min=8 Max=20}}", - TextLipsum = "{{Random Type=\"TextLipsum\"}}", - IBAN = "{{Random Type=\"IBAN\" CountryCode=\"NL\"}}", - TimeSpan1 = "{{Random Type=\"TimeSpan\" Format=\"c\" IncludeMilliseconds=false}}", - TimeSpan2 = "{{Random Type=\"TimeSpan\"}}", - DateTime1 = "{{Random Type=\"DateTime\"}}", - DateTimeNow = DateTime.Now, - DateTimeNowToString = DateTime.Now.ToString("s", CultureInfo.InvariantCulture), - Guid1 = "{{Random Type=\"Guid\" Uppercase=false}}", - Guid2 = "{{Random Type=\"Guid\"}}", - Guid3 = "{{Random Type=\"Guid\" Format=\"X\"}}", - Boolean = "{{Random Type=\"Boolean\"}}", - Integer = "{{Random Type=\"Integer\" Min=1000 Max=9999}}", - Long = "{{#Random Type=\"Long\" Min=10000000 Max=99999999}}{{this}}{{/Random}}", - Double = "{{Random Type=\"Double\" Min=10 Max=99}}", - Float = "{{Random Type=\"Float\" Min=100 Max=999}}", - IP4Address = "{{Random Type=\"IPv4Address\" Min=\"10.2.3.4\"}}", - IP6Address = "{{Random Type=\"IPv6Address\"}}", - MACAddress = "{{Random Type=\"MACAddress\" Separator=\"-\"}}", - StringListValue = "{{Random Type=\"StringList\" Values=[\"a\", \"b\", \"c\"]}}" - }) - .WithTransformer() - ); - - server - .Given(Request.Create() - .UsingPost() - .WithPath("/xpathsoap") - .WithBody(new XPathMatcher("//*[local-name() = 'getMyData']")) - ) - .RespondWith(Response.Create() - .WithHeader("Content-Type", "application/xml") - .WithBody("ok") - ); - - server - .Given(Request.Create() - .UsingPost() - .WithPath("/post_with_query") - .WithHeader("PRIVATE-TOKEN", "t") - .WithParam("name", "stef") - .WithParam("path", "p") - .WithParam("visibility", "Private") - .WithParam("parent_id", "1") - ) - .RespondWith(Response.Create() - .WithBody("OK : post_with_query") - ); - - server.Given(Request.Create() - .WithPath("/services/query/") - .WithParam("q", "SELECT Id from User where username='user@gmail.com'") - .UsingGet()) - .RespondWith(Response.Create() - .WithStatusCode(200) - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { Id = "5bdf076c-5654-4b3e-842c-7caf1fabf8c9" })); - server - .Given(Request.Create().WithPath("/random200or505").UsingGet()) - .RespondWith(Response.Create().WithCallback(request => new ResponseMessage - { - StatusCode = new Random().Next(1, 100) == 1 ? 504 : 200 - })); - - System.Console.WriteLine(JsonConvert.SerializeObject(server.MappingModels, Formatting.Indented)); - - System.Console.WriteLine("Press any key to stop the server"); - System.Console.ReadKey(); - server.Stop(); - - System.Console.WriteLine("Displaying all requests"); - var allRequests = server.LogEntries; - System.Console.WriteLine(JsonConvert.SerializeObject(allRequests, Formatting.Indented)); - - System.Console.WriteLine("Press any key to quit"); - System.Console.ReadKey(); - } - } +using Newtonsoft.Json; +using HandlebarsDotNet; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Net; +using WireMock.Logging; +using WireMock.Matchers; +using WireMock.RequestBuilders; +using WireMock.ResponseBuilders; +using WireMock.Server; +using WireMock.Settings; +using WireMock.Util; + +namespace WireMock.Net.ConsoleApplication +{ + public interface IHandleBarTransformer + { + string Name { get; } + + void Render(TextWriter textWriter, dynamic context, object[] arguments); + } + + public class CustomNameTransformer : IHandleBarTransformer + { + public string Name => "CustomName"; + + public void Render(TextWriter writer, dynamic context, object[] parameters) + { + /* Handlebar logic to render */ + } + } + + public static class MainApp + { + public static void Run() + { + var s = WireMockServer.Start(); + s.Stop(); + + string url1 = "http://localhost:9091/"; + string url2 = "http://localhost:9092/"; + string url3 = "https://localhost:9443/"; + + var server = WireMockServer.Start(new WireMockServerSettings + { + AllowCSharpCodeMatcher = true, + Urls = new[] { url1, url2, url3 }, + StartAdminInterface = true, + ReadStaticMappings = true, + WatchStaticMappings = true, + WatchStaticMappingsInSubdirectories = true, + //ProxyAndRecordSettings = new ProxyAndRecordSettings + //{ + // SaveMapping = true + //}, + PreWireMockMiddlewareInit = app => { System.Console.WriteLine($"PreWireMockMiddlewareInit : {app.GetType()}"); }, + PostWireMockMiddlewareInit = app => { System.Console.WriteLine($"PostWireMockMiddlewareInit : {app.GetType()}"); }, + Logger = new WireMockConsoleLogger(), + + HandlebarsRegistrationCallback = (handlebarsContext, fileSystemHandler) => + { + var transformer = new CustomNameTransformer(); + handlebarsContext.RegisterHelper(transformer.Name, transformer.Render); + }, + + // Uncomment below if you want to use the CustomFileSystemFileHandler + // FileSystemHandler = new CustomFileSystemFileHandler() + }); + System.Console.WriteLine("WireMockServer listening at {0}", string.Join(",", server.Urls)); + + server.SetBasicAuthentication("a", "b"); + + // server.AllowPartialMapping(); + + server + .Given(Request.Create().WithPath(p => p.Contains("x")).UsingGet()) + .AtPriority(4) + .RespondWith(Response.Create() + .WithStatusCode(200) + .WithHeader("Content-Type", "application/json") + .WithBody(@"{ ""result"": ""Contains x with FUNC 200""}")); + + server + .Given(Request.Create() + .UsingGet() + .WithPath("/proxy-test-keep-alive") + ) + .RespondWith(Response.Create() + .WithHeader("Keep-Alive", "timeout=1, max=1") + ); + + server + .Given(Request.Create() + .UsingPost() + .WithHeader("postmanecho", "post") + ) + .RespondWith(Response.Create() + .WithProxy(new ProxyAndRecordSettings { Url = "http://postman-echo.com/post" }) + ); + + server + .Given(Request.Create() + .UsingGet() + .WithHeader("postmanecho", "get") + ) + .RespondWith(Response.Create() + .WithProxy(new ProxyAndRecordSettings { Url = "http://postman-echo.com/get" }) + ); + + server + .Given(Request.Create() + .UsingGet() + .WithHeader("postmanecho", "get2") + ) + .RespondWith(Response.Create() + .WithProxy(new ProxyAndRecordSettings + { + Url = "http://postman-echo.com/get", + WebProxySettings = new WebProxySettings + { + Address = "http://company", + UserName = "test", + Password = "pwd" + } + }) + ); + + server + .Given(Request.Create() + .UsingGet() + .WithPath("/proxy-execute-keep-alive") + ) + .RespondWith(Response.Create() + .WithProxy(new ProxyAndRecordSettings { Url = "http://localhost:9999", BlackListedHeaders = new[] { "Keep-Alive" } }) + .WithHeader("Keep-Alive-Test", "stef") + ); + + server + .Given(Request.Create() + .WithPath("/xpath").UsingPost() + .WithBody(new XPathMatcher("/todo-list[count(todo-item) = 3]")) + ) + .RespondWith(Response.Create().WithBody("XPathMatcher!")); + + server + .Given(Request.Create() + .WithPath("/xpaths").UsingPost() + .WithBody(new[] { new XPathMatcher("/todo-list[count(todo-item) = 3]"), new XPathMatcher("/todo-list[count(todo-item) = 4]") }) + ) + .RespondWith(Response.Create().WithBody("xpaths!")); + + server + .Given(Request + .Create() + .WithPath("/jsonthings") + .WithBody(new JsonPathMatcher("$.things[?(@.name == 'RequiredThing')]")) + .UsingPut()) + .RespondWith(Response.Create() + .WithBody(@"{ ""result"": ""JsonPathMatcher !!!""}")); + + server + .Given(Request + .Create() + .WithPath("/jsonbodytest1") + .WithBody(new JsonMatcher("{ \"x\": 42, \"s\": \"s\" }")) + .UsingPost()) + .WithGuid("debaf408-3b23-4c04-9d18-ef1c020e79f2") + .RespondWith(Response.Create() + .WithBody(@"{ ""result"": ""jsonbodytest1"" }")); + + server + .Given(Request + .Create() + .WithPath("/jsonbodytest2") + .WithBody(new JsonMatcher(new { x = 42, s = "s" })) + .UsingPost()) + .WithGuid("debaf408-3b23-4c04-9d18-ef1c020e79f3") + .RespondWith(Response.Create() + .WithBody(@"{ ""result"": ""jsonbodytest2"" }")); + + server + .Given(Request + .Create() + .WithPath(new WildcardMatcher("/navision/OData/Company('My Company')/School*", true)) + .WithParam("$filter", "(substringof(Code, 'WA')") + .UsingGet()) + .RespondWith(Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBody(@"{ ""result"": ""odata""}")); + + server + .Given(Request + .Create() + .WithPath(new WildcardMatcher("/param2", true)) + .WithParam("key", "test") + .UsingGet()) + .RespondWith(Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { result = "param2" })); + + server + .Given(Request + .Create() + .WithPath(new WildcardMatcher("/param3", true)) + .WithParam("key", new WildcardMatcher("t*")) + .UsingGet()) + .RespondWith(Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { result = "param3" })); + + server + .Given(Request.Create().WithPath("/headers", "/headers_test").UsingPost().WithHeader("Content-Type", "application/json*")) + .RespondWith(Response.Create() + .WithStatusCode(201) + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { result = "data:headers posted with 201" })); + + if (!System.IO.File.Exists(@"c:\temp\x.json")) + { + System.IO.File.WriteAllText(@"c:\temp\x.json", "{ \"hello\": \"world\", \"answer\": 42 }"); + } + + server + .Given(Request.Create().WithPath("/file").UsingGet()) + .RespondWith(Response.Create() + .WithBodyFromFile(@"c:\temp\x.json", false) + ); + + server + .Given(Request.Create().WithPath("/filecache").UsingGet()) + .RespondWith(Response.Create() + .WithBodyFromFile(@"c:\temp\x.json") + ); + + server + .Given(Request.Create().WithPath("/file_rel").UsingGet()) + .WithGuid("0000aaaa-fcf4-4256-a0d3-1c76e4862947") + .RespondWith(Response.Create() + .WithHeader("Content-Type", "application/xml") + .WithBodyFromFile("WireMock.Net.xml", false) + ); + + server + .Given(Request.Create().WithHeader("ProxyThis", "true") + .UsingGet()) + .RespondWith(Response.Create() + .WithProxy("http://www.google.com") + ); + + server + .Given(Request.Create().WithPath("/bodyasbytes.png") + .UsingGet()) + .RespondWith(Response.Create() + .WithHeader("Content-Type", "image/png") + .WithBody(Convert.FromBase64String("iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTczbp9jAAAAJ0lEQVQoU2NgUPuPD6Hz0RCEAtJoiAxpCCBXGgmRIo0TofORkdp/AMiMdRVnV6O0AAAAAElFTkSuQmCC")) + ); + + server + .Given(Request.Create().WithPath("/oauth2/access").UsingPost().WithBody("grant_type=password;username=u;password=p")) + .RespondWith(Response.Create() + .WithStatusCode(200) + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { access_token = "AT", refresh_token = "RT" })); + + server + .Given(Request.Create().WithPath("/helloworld").UsingGet().WithHeader("Authorization", new RegexMatcher("^(?i)Bearer AT$"))) + .RespondWith(Response.Create() + .WithStatusCode(200) + .WithBody("hi")); + + server + .Given(Request.Create().WithPath("/data").UsingPost().WithBody(b => b.Contains("e"))) + .AtPriority(999) + .RespondWith(Response.Create() + .WithStatusCode(201) + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { result = "data posted with FUNC 201" })); + + server + .Given(Request.Create().WithPath("/json").UsingPost().WithBody(new JsonPathMatcher("$.things[?(@.name == 'RequiredThing')]"))) + .RespondWith(Response.Create() + .WithStatusCode(201) + .WithHeader("Content-Type", "application/json") + .WithBody(@"{ ""result"": ""json posted with 201""}")); + + server + .Given(Request.Create().WithPath("/json2").UsingPost().WithBody("x")) + .RespondWith(Response.Create() + .WithStatusCode(201) + .WithHeader("Content-Type", "application/json") + .WithBody(@"{ ""result"": ""json posted with x - 201""}")); + + server + .Given(Request.Create().WithPath("/data").UsingDelete()) + .RespondWith(Response.Create() + .WithStatusCode(200) + .WithHeader("Content-Type", "application/json") + .WithBody(@"{ ""result"": ""data deleted with 200""}")); + + server + .Given(Request.Create() + .WithPath("/needs-a-key") + .UsingGet() + .WithHeader("api-key", "*", MatchBehaviour.AcceptOnMatch) + .UsingAnyMethod()) + .RespondWith(Response.Create() + .WithStatusCode(HttpStatusCode.OK) + .WithBody(@"{ ""result"": ""api-key found""}")); + + server + .Given(Request.Create() + .WithPath("/needs-a-key") + .UsingGet() + .WithHeader("api-key", "*", MatchBehaviour.RejectOnMatch) + .UsingAnyMethod()) + .RespondWith(Response.Create() + .WithStatusCode(HttpStatusCode.Unauthorized) + .WithBody(@"{ ""result"": ""api-key missing""}")); + + server + .Given(Request.Create().WithPath("/nobody").UsingGet()) + .RespondWith(Response.Create().WithDelay(TimeSpan.FromSeconds(1)) + .WithStatusCode(200)); + + server + .Given(Request.Create().WithPath("/partial").UsingPost().WithBody(new SimMetricsMatcher(new[] { "cat", "dog" }))) + .RespondWith(Response.Create().WithStatusCode(200).WithBody("partial = 200")); + + // http://localhost:8080/trans?start=1000&stop=1&stop=2 + server + .Given(Request.Create().WithPath("/trans").UsingGet()) + .WithGuid("90356dba-b36c-469a-a17e-669cd84f1f05") + .RespondWith(Response.Create() + .WithStatusCode(200) + .WithHeader("Content-Type", "application/json") + .WithHeader("Transformed-Postman-Token", "token is {{request.headers.Postman-Token}}") + .WithHeader("xyz_{{request.headers.Postman-Token}}", "token is {{request.headers.Postman-Token}}") + .WithBody(@"{""msg"": ""Hello world CATCH-ALL on /*, {{request.path}}, bykey={{request.query.start}}, bykey={{request.query.stop}}, byidx0={{request.query.stop.[0]}}, byidx1={{request.query.stop.[1]}}"" }") + .WithTransformer() + .WithDelay(TimeSpan.FromMilliseconds(100)) + ); + + server + .Given(Request.Create().WithPath("/jsonpathtestToken").UsingPost()) + .RespondWith(Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBody("{{JsonPath.SelectToken request.body \"$.Manufacturers[?(@.Name == 'Acme Co')]\"}}") + .WithTransformer() + ); + + server + .Given(Request.Create().WithPath("/zubinix").UsingPost()) + .RespondWith(Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBody("{ \"result\": \"{{JsonPath.SelectToken request.bodyAsJson \"username\"}}\" }") + .WithTransformer() + ); + + server + .Given(Request.Create().WithPath("/zubinix2").UsingPost()) + .RespondWith(Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { path = "{{request.path}}", result = "{{JsonPath.SelectToken request.bodyAsJson \"username\"}}" }) + .WithTransformer() + ); + + server + .Given(Request.Create().WithPath("/jsonpathtestTokenJson").UsingPost()) + .RespondWith(Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { status = "OK", url = "{{request.url}}", transformed = "{{JsonPath.SelectToken request.body \"$.Manufacturers[?(@.Name == 'Acme Co')]\"}}" }) + .WithTransformer() + ); + + server + .Given(Request.Create().WithPath("/jsonpathtestTokens").UsingPost()) + .RespondWith(Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBody("[{{#JsonPath.SelectTokens request.body \"$..Products[?(@.Price >= 50)].Name\"}} { \"idx\":{{id}}, \"value\":\"{{value}}\" }, {{/JsonPath.SelectTokens}} {} ]") + .WithTransformer() + ); + + server + .Given(Request.Create() + .WithPath("/state1") + .UsingGet()) + .InScenario("s1") + .WillSetStateTo("Test state 1") + .RespondWith(Response.Create() + .WithBody("No state msg 1")); + + server + .Given(Request.Create() + .WithPath("/foostate1") + .UsingGet()) + .InScenario("s1") + .WhenStateIs("Test state 1") + .RespondWith(Response.Create() + .WithBody("Test state msg 1")); + + server + .Given(Request.Create() + .WithPath("/state2") + .UsingGet()) + .InScenario("s2") + .WillSetStateTo("Test state 2") + .RespondWith(Response.Create() + .WithBody("No state msg 2")); + + server + .Given(Request.Create() + .WithPath("/foostate2") + .UsingGet()) + .InScenario("s2") + .WhenStateIs("Test state 2") + .RespondWith(Response.Create() + .WithBody("Test state msg 2")); + + server + .Given(Request.Create().WithPath("/encoded-test/a%20b")) + .RespondWith(Response.Create() + .WithBody("EncodedTest 1 : Path={{request.path}}, Url={{request.url}}") + .WithTransformer() + ); + + server + .Given(Request.Create().WithPath("/encoded-test/a b")) + .RespondWith(Response.Create() + .WithBody("EncodedTest 2 : Path={{request.path}}, Url={{request.url}}") + .WithTransformer() + ); + + // https://stackoverflow.com/questions/51985089/wiremock-request-matching-with-comparison-between-two-query-parameters + server + .Given(Request.Create().WithPath("/linq") + .WithParam("from", new LinqMatcher("DateTime.Parse(it) > \"2018-03-01 00:00:00\""))) + .RespondWith(Response.Create() + .WithBody("linq match !!!") + ); + + server + .Given(Request.Create().WithPath("/myendpoint").UsingAnyMethod()) + .RespondWith(Response.Create() + .WithStatusCode(500) + .WithBody(requestMessage => + { + return JsonConvert.SerializeObject(new + { + Message = "Test error" + }); + }) + ); + + server + .Given(Request.Create().WithPath("/random")) + .RespondWith(Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new + { + Xeger1 = "{{Xeger \"\\w{4}\\d{5}\"}}", + Xeger2 = "{{Xeger \"\\d{5}\"}}", + TextRegexPostcode = "{{Random Type=\"TextRegex\" Pattern=\"[1-9][0-9]{3}[A-Z]{2}\"}}", + Text = "{{Random Type=\"Text\" Min=8 Max=20}}", + TextLipsum = "{{Random Type=\"TextLipsum\"}}", + IBAN = "{{Random Type=\"IBAN\" CountryCode=\"NL\"}}", + TimeSpan1 = "{{Random Type=\"TimeSpan\" Format=\"c\" IncludeMilliseconds=false}}", + TimeSpan2 = "{{Random Type=\"TimeSpan\"}}", + DateTime1 = "{{Random Type=\"DateTime\"}}", + DateTimeNow = DateTime.Now, + DateTimeNowToString = DateTime.Now.ToString("s", CultureInfo.InvariantCulture), + Guid1 = "{{Random Type=\"Guid\" Uppercase=false}}", + Guid2 = "{{Random Type=\"Guid\"}}", + Guid3 = "{{Random Type=\"Guid\" Format=\"X\"}}", + Boolean = "{{Random Type=\"Boolean\"}}", + Integer = "{{Random Type=\"Integer\" Min=1000 Max=9999}}", + Long = "{{#Random Type=\"Long\" Min=10000000 Max=99999999}}{{this}}{{/Random}}", + Double = "{{Random Type=\"Double\" Min=10 Max=99}}", + Float = "{{Random Type=\"Float\" Min=100 Max=999}}", + IP4Address = "{{Random Type=\"IPv4Address\" Min=\"10.2.3.4\"}}", + IP6Address = "{{Random Type=\"IPv6Address\"}}", + MACAddress = "{{Random Type=\"MACAddress\" Separator=\"-\"}}", + StringListValue = "{{Random Type=\"StringList\" Values=[\"a\", \"b\", \"c\"]}}" + }) + .WithTransformer() + ); + + server + .Given(Request.Create() + .UsingPost() + .WithPath("/xpathsoap") + .WithBody(new XPathMatcher("//*[local-name() = 'getMyData']")) + ) + .RespondWith(Response.Create() + .WithHeader("Content-Type", "application/xml") + .WithBody("ok") + ); + + server + .Given(Request.Create() + .UsingPost() + .WithPath("/post_with_query") + .WithHeader("PRIVATE-TOKEN", "t") + .WithParam("name", "stef") + .WithParam("path", "p") + .WithParam("visibility", "Private") + .WithParam("parent_id", "1") + ) + .RespondWith(Response.Create() + .WithBody("OK : post_with_query") + ); + + server.Given(Request.Create() + .WithPath("/services/query/") + .WithParam("q", "SELECT Id from User where username='user@gmail.com'") + .UsingGet()) + .RespondWith(Response.Create() + .WithStatusCode(200) + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { Id = "5bdf076c-5654-4b3e-842c-7caf1fabf8c9" })); + server + .Given(Request.Create().WithPath("/random200or505").UsingGet()) + .RespondWith(Response.Create().WithCallback(request => new ResponseMessage + { + StatusCode = new Random().Next(1, 100) == 1 ? 504 : 200 + })); + + System.Console.WriteLine(JsonConvert.SerializeObject(server.MappingModels, Formatting.Indented)); + + System.Console.WriteLine("Press any key to stop the server"); + System.Console.ReadKey(); + server.Stop(); + + System.Console.WriteLine("Displaying all requests"); + var allRequests = server.LogEntries; + System.Console.WriteLine(JsonConvert.SerializeObject(allRequests, Formatting.Indented)); + + System.Console.WriteLine("Press any key to quit"); + System.Console.ReadKey(); + } + } } \ No newline at end of file diff --git a/src/WireMock.Net/Owin/HostUrlOptions.cs b/src/WireMock.Net/Owin/HostUrlOptions.cs index cd404dd2..e85c0324 100644 --- a/src/WireMock.Net/Owin/HostUrlOptions.cs +++ b/src/WireMock.Net/Owin/HostUrlOptions.cs @@ -1,43 +1,43 @@ -using System.Collections.Generic; -using WireMock.Util; - -namespace WireMock.Owin -{ - internal class HostUrlOptions - { - public ICollection Urls { get; set; } - - public int? Port { get; set; } - - public bool UseSSL { get; set; } - - public ICollection<(string Url, int Port)> GetDetails() - { - var list = new List<(string Url, int Port)>(); - if (Urls == null) - { - int port = Port ?? FindFreeTcpPort(); - list.Add(($"{(UseSSL ? "https" : "http")}://localhost:{port}", port)); - } - else - { - foreach (string url in Urls) - { - PortUtils.TryExtract(url, out string protocol, out string host, out int port); - list.Add((url, port)); - } - } - - return list; - } - - private int FindFreeTcpPort() - { -#if USE_ASPNETCORE || NETSTANDARD2_0 || NETSTANDARD2_1 - return 0; -#else - return PortUtils.FindFreeTcpPort(); -#endif - } - } +using System.Collections.Generic; +using WireMock.Util; + +namespace WireMock.Owin +{ + internal class HostUrlOptions + { + public ICollection Urls { get; set; } + + public int? Port { get; set; } + + public bool UseSSL { get; set; } + + public ICollection<(string Url, int Port)> GetDetails() + { + var list = new List<(string Url, int Port)>(); + if (Urls == null) + { + int port = Port > 0 ? Port.Value : FindFreeTcpPort(); + list.Add(($"{(UseSSL ? "https" : "http")}://localhost:{port}", port)); + } + else + { + foreach (string url in Urls) + { + PortUtils.TryExtract(url, out string protocol, out string host, out int port); + list.Add((url, port)); + } + } + + return list; + } + + private int FindFreeTcpPort() + { +#if USE_ASPNETCORE || NETSTANDARD2_0 || NETSTANDARD2_1 + return 0; +#else + return PortUtils.FindFreeTcpPort(); +#endif + } + } } \ No newline at end of file