diff --git a/examples/WireMock.Net.Console.NETCoreApp/WireMock.Net.Console.NETCoreApp.csproj b/examples/WireMock.Net.Console.NETCoreApp/WireMock.Net.Console.NETCoreApp.csproj index 1d956dfd..936d5ebf 100644 --- a/examples/WireMock.Net.Console.NETCoreApp/WireMock.Net.Console.NETCoreApp.csproj +++ b/examples/WireMock.Net.Console.NETCoreApp/WireMock.Net.Console.NETCoreApp.csproj @@ -6,10 +6,17 @@ ../../WireMock.Net-Logo.ico + + + + PreserveNewest + + PreserveNewest + diff --git a/examples/WireMock.Net.Console.NETCoreApp/__admin/mappings/826aff7c-6208-4a3c-923d-575248907db4.json b/examples/WireMock.Net.Console.NETCoreApp/__admin/mappings/826aff7c-6208-4a3c-923d-575248907db4.json new file mode 100644 index 00000000..ca2c5440 --- /dev/null +++ b/examples/WireMock.Net.Console.NETCoreApp/__admin/mappings/826aff7c-6208-4a3c-923d-575248907db4.json @@ -0,0 +1,41 @@ +{ + "Guid": "826aff7c-6208-4a3c-923d-575248907db4", + "Priority": 0, + "Request": { + "Path": { + "Matchers": [ + { + "Name": "WildcardMatcher", + "Pattern": "/earth/story/20170510-terrifying-20m-tall-rogue-waves-are-actually-real" + } + ] + }, + "Methods": [ + "get" + ] + }, + "Response": { + "StatusCode": 200, + "Body": " BBC - Homepage \n\n\n\n\n\n\n \n\n\n\n\n \n \n\n\n\n \n\n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n\n \n \n \n \n \n \n \n\n \r\n\r\n\r\n \n \n
\n

Accessibility links

\n\n \n Notifications\n \n \n \n \n
Search\n\n
\n
\n \n \n \n \n \n
\n
\n\n\n
\n\n\n\n\n

BBC Homepage

\n\n
\n \n
\n

 

\n

\n News\n

\n

\n Sport\n

\n
\r\n
\r\n

\n Editor’s Picks\n

\n

\n Featured video\n

\n
\n \n
\n
\n
\"'Attention!
\n\n \n \n
\n\n

\n \n 'Attention! You are next to 15 great white sharks' \n

\n\n

\n A sheriff's helicopter crew warns paddle-boarders they are swimming with sharks off the California coast.

\n \n US\n \n
\n\n \n 'Attention! You are next to 15 great white sharks' \n
\n\n \n
\r\n

\n More from around the BBC\n

\n

\n BBC in other languages\n

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
\n \n\n \n ", + "BodyEncoding": { + "CodePage": 65001, + "EncodingName": "Unicode (UTF-8)", + "WebName": "utf-8" + }, + "UseTransformer": false, + "Headers": { + "Set-Cookie": "BBC-UID=d5e9e11601d6a92baa56889831b1cedf3e0040fa733856b32b0ba4234e28e4740PostmanRuntime/3.0.11-hotfix.2; expires=Tue, 11-May-21 20:10:03 GMT; path=/; domain=.bbc.com", + "Cache-Control": "max-age=60, private", + "Vary": "X-CDN", + "X-Cache-Action": "HIT", + "Date": "Fri, 12 May 2017 20:10:03 GMT", + "ETag": "\"777c5af8426c21563a57166e437d820a\"", + "X-PAL-Host": "pal010.back.live.cwwtf.local:80", + "Connection": "keep-alive", + "X-Cache-Hits": "5", + "Server": "Apache", + "X-Cache-Age": "37", + "X-LB-NoCache": "true" + } + } +} \ No newline at end of file diff --git a/examples/WireMock.Net.Console.Record.NETCoreApp/__admin/mappings/ab38efae-4e4d-4f20-8afe-635533ec2535.json b/examples/WireMock.Net.Console.Record.NETCoreApp/__admin/mappings/ab38efae-4e4d-4f20-8afe-635533ec2535.json new file mode 100644 index 00000000..8f3d5711 --- /dev/null +++ b/examples/WireMock.Net.Console.Record.NETCoreApp/__admin/mappings/ab38efae-4e4d-4f20-8afe-635533ec2535.json @@ -0,0 +1,41 @@ +{ + "Guid": "ab38efae-4e4d-4f20-8afe-635533ec2535", + "Title": "", + "Priority": 0, + "Request": { + "Path": { + "Matchers": [ + { + "Name": "WildcardMatcher", + "Pattern": "/earth/story/20170510-terrifying-20m-tall-rogue-waves-are-actually-real" + } + ] + }, + "Methods": [ + "get" + ] + }, + "Response": { + "StatusCode": 200, + "Body": " BBC - Homepage \n\n\n\n\n\n\n \n\n\n\n\n \n \n\n\n\n \n\n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n\n \n \n \n \n \n \n \n\n \r\n\r\n\r\n \n \n
\n

Accessibility links

\n\n \n Notifications\n \n \n \n \n
Search\n\n
\n
\n \n \n \n \n \n
\n
\n\n\n
\n\n\n\n\n

BBC Homepage

\n\n
\n \n
\n

 

\n

\n News\n

\n

\n Sport\n

\n
\r\n
\r\n

\n Editor’s Picks\n

\n

\n Featured video\n

\n
\n \n
\n
\n
\"'Attention!
\n\n \n \n
\n\n

\n \n 'Attention! You are next to 15 great white sharks' \n

\n\n

\n A sheriff's helicopter crew warns paddle-boarders they are swimming with sharks off the California coast.

\n \n US\n \n
\n\n \n 'Attention! You are next to 15 great white sharks' \n
\n\n \n
\r\n

\n More from around the BBC\n

\n

\n BBC in other languages\n

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
\n \n\n \n ", + "BodyEncoding": { + "CodePage": 65001, + "EncodingName": "Unicode (UTF-8)", + "WebName": "utf-8" + }, + "UseTransformer": false, + "Headers": { + "X-LB-NoCache": "true", + "X-Cache-Age": "0", + "ETag": "\"07931511980b88249a64e043d5f5341d\"", + "Connection": "keep-alive", + "Cache-Control": "max-age=60, private", + "X-PAL-Host": "pal128.back.live.telhc.local:80", + "Date": "Fri, 12 May 2017 20:20:25 GMT", + "Server": "Apache", + "Vary": "X-CDN", + "Set-Cookie": "BBC-UID=c58921a6d13960c8991318b121db82a089b7948f332826838beba493b8b8c4880PostmanRuntime/3.0.11-hotfix.2; expires=Tue, 11-May-21 20:20:25 GMT; path=/; domain=.bbc.com", + "X-Cache-Action": "MISS" + } + } +} \ No newline at end of file diff --git a/src/WireMock.Net/Http/HttpClientHelper.cs b/src/WireMock.Net/Http/HttpClientHelper.cs index b7a5df17..d18d5765 100644 --- a/src/WireMock.Net/Http/HttpClientHelper.cs +++ b/src/WireMock.Net/Http/HttpClientHelper.cs @@ -7,47 +7,46 @@ namespace WireMock.Http { internal static class HttpClientHelper { + private static HttpClient client = new HttpClient(); + public static async Task SendAsync(RequestMessage requestMessage, string url) { - using (var client = new HttpClient()) + var httpRequestMessage = new HttpRequestMessage(new HttpMethod(requestMessage.Method), url); + + // Overwrite the host header + httpRequestMessage.Headers.Host = new Uri(url).Authority; + + // Set headers if present + if (requestMessage.Headers != null) { - var httpRequestMessage = new HttpRequestMessage(new HttpMethod(requestMessage.Method), url); - - // Overwrite the host header - httpRequestMessage.Headers.Host = new Uri(url).Authority; - - // Set headers if present - if (requestMessage.Headers != null) + foreach (var headerName in requestMessage.Headers.Keys.Where(k => k.ToUpper() != "HOST")) { - foreach (var headerName in requestMessage.Headers.Keys.Where(k => k.ToUpper() != "HOST")) - { - httpRequestMessage.Headers.Add(headerName, new[] { requestMessage.Headers[headerName] }); - } + httpRequestMessage.Headers.Add(headerName, new[] { requestMessage.Headers[headerName] }); } - - // Set Body if present - if (requestMessage.BodyAsBytes != null && requestMessage.BodyAsBytes.Length > 0) - { - httpRequestMessage.Content = new ByteArrayContent(requestMessage.BodyAsBytes); - } - - // Call the URL - var httpResponseMessage = await client.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseContentRead); - - // Transform response - var responseMessage = new ResponseMessage - { - StatusCode = (int)httpResponseMessage.StatusCode, - Body = await httpResponseMessage.Content.ReadAsStringAsync() - }; - - foreach (var header in httpResponseMessage.Headers) - { - responseMessage.AddHeader(header.Key, header.Value.FirstOrDefault()); - } - - return responseMessage; } + + // Set Body if present + if (requestMessage.BodyAsBytes != null && requestMessage.BodyAsBytes.Length > 0) + { + httpRequestMessage.Content = new ByteArrayContent(requestMessage.BodyAsBytes); + } + + // Call the URL + var httpResponseMessage = await client.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseContentRead); + + // Transform response + var responseMessage = new ResponseMessage + { + StatusCode = (int)httpResponseMessage.StatusCode, + Body = await httpResponseMessage.Content.ReadAsStringAsync() + }; + + foreach (var header in httpResponseMessage.Headers) + { + responseMessage.AddHeader(header.Key, header.Value.FirstOrDefault()); + } + + return responseMessage; } } } \ No newline at end of file diff --git a/src/WireMock.Net/Server/FluentMockServer.Admin.cs b/src/WireMock.Net/Server/FluentMockServer.Admin.cs index 1f640f4e..9a2a6255 100644 --- a/src/WireMock.Net/Server/FluentMockServer.Admin.cs +++ b/src/WireMock.Net/Server/FluentMockServer.Admin.cs @@ -130,8 +130,22 @@ namespace WireMock.Server { var responseMessage = await HttpClientHelper.SendAsync(requestMessage, settings.Url); + var mapping = ToMapping(requestMessage, responseMessage); + SaveMappingToFile(mapping); + return responseMessage; } + + private Mapping ToMapping(RequestMessage requestMessage, ResponseMessage responseMessage) + { + var request = (Request)Request.Create(); + request.WithPath(requestMessage.Path); + request.UsingVerb(requestMessage.Method); + + var response = (Response)Response.Create(responseMessage); + + return new Mapping(Guid.NewGuid(), string.Empty, request, response, 0); + } #endregion #region Settings @@ -211,21 +225,26 @@ namespace WireMock.Server #region Mappings private ResponseMessage MappingsSave(RequestMessage requestMessage) + { + foreach (var mapping in Mappings.Where(m => !m.IsAdminInterface)) + { + SaveMappingToFile(mapping); + } + + return new ResponseMessage { Body = "Mappings saved to disk" }; + } + + private void SaveMappingToFile(Mapping mapping) { string folder = Path.Combine(Directory.GetCurrentDirectory(), AdminMappingsFolder); if (!Directory.Exists(folder)) Directory.CreateDirectory(folder); - foreach (var mapping in Mappings.Where(m => !m.IsAdminInterface)) - { - var model = ToMappingModel(mapping); - string json = JsonConvert.SerializeObject(model, _settings); - string filename = !string.IsNullOrEmpty(mapping.Title) ? SanitizeFileName(mapping.Title) : mapping.Guid.ToString(); + var model = ToMappingModel(mapping); + string json = JsonConvert.SerializeObject(model, _settings); + string filename = !string.IsNullOrEmpty(mapping.Title) ? SanitizeFileName(mapping.Title) : mapping.Guid.ToString(); - File.WriteAllText(Path.Combine(folder, filename + ".json"), json); - } - - return new ResponseMessage { Body = "Mappings saved to disk" }; + File.WriteAllText(Path.Combine(folder, filename + ".json"), json); } private static string SanitizeFileName(string name, char replaceChar = '_')