From b25371cf156ab103755cfa128f65a6ec558e1e57 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 9 May 2017 20:14:52 +0200 Subject: [PATCH] Refactor code --- src/WireMock.Net/Http/HttpClientHelper.cs | 53 ++++++++++++ src/WireMock.Net/ResponseBuilders/Response.cs | 85 +++---------------- .../ResponseMessageTransformer.cs | 33 +++++++ 3 files changed, 98 insertions(+), 73 deletions(-) create mode 100644 src/WireMock.Net/Http/HttpClientHelper.cs create mode 100644 src/WireMock.Net/Transformers/ResponseMessageTransformer.cs diff --git a/src/WireMock.Net/Http/HttpClientHelper.cs b/src/WireMock.Net/Http/HttpClientHelper.cs new file mode 100644 index 00000000..b7a5df17 --- /dev/null +++ b/src/WireMock.Net/Http/HttpClientHelper.cs @@ -0,0 +1,53 @@ +using System; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; + +namespace WireMock.Http +{ + internal static class HttpClientHelper + { + 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) + { + foreach (var headerName in requestMessage.Headers.Keys.Where(k => k.ToUpper() != "HOST")) + { + 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; + } + } + } +} \ No newline at end of file diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index b765768d..e7ece5ac 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -1,15 +1,13 @@ using System; -using System.Collections.Concurrent; using System.Collections.Generic; -using System.Linq; using System.Net; -using System.Net.Http; using System.Text; using System.Threading.Tasks; -using HandlebarsDotNet; using JetBrains.Annotations; using Newtonsoft.Json; using WireMock.Validation; +using WireMock.Http; +using WireMock.Transformers; namespace WireMock.ResponseBuilders { @@ -261,78 +259,19 @@ namespace WireMock.ResponseBuilders { Check.NotNull(requestMessage, nameof(requestMessage)); - ResponseMessage responseMessage; - - if (ProxyUrl != null) - { - using (var client = new HttpClient()) - { - var httpRequestMessage = new HttpRequestMessage(new HttpMethod(requestMessage.Method), ProxyUrl); - - // Overwrite the host header - httpRequestMessage.Headers.Host = new Uri(ProxyUrl).Authority; - - // Set headers if present - if (requestMessage.Headers != null) - { - foreach (var headerName in requestMessage.Headers.Keys.Where(k => k.ToUpper() != "HOST")) - { - 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 - 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()); - } - } - } - else if (UseTransformer) - { - responseMessage = new ResponseMessage { StatusCode = ResponseMessage.StatusCode, BodyOriginal = ResponseMessage.Body }; - - var template = new { request = requestMessage }; - - // Body - var templateBody = Handlebars.Compile(ResponseMessage.Body); - responseMessage.Body = templateBody(template); - - // Headers - var newHeaders = new Dictionary(); - foreach (var header in ResponseMessage.Headers) - { - var templateHeaderKey = Handlebars.Compile(header.Key); - var templateHeaderValue = Handlebars.Compile(header.Value); - - newHeaders.Add(templateHeaderKey(template), templateHeaderValue(template)); - } - responseMessage.Headers = newHeaders; - } - else - { - responseMessage = ResponseMessage; - } - if (Delay != null) await Task.Delay(Delay.Value); - return responseMessage; + if (ProxyUrl != null) + { + return await HttpClientHelper.SendAsync(requestMessage, ProxyUrl); + } + else if (UseTransformer) + { + return ResponseMessageTransformer.Transform(requestMessage, ResponseMessage); + } + + return ResponseMessage; } } } \ No newline at end of file diff --git a/src/WireMock.Net/Transformers/ResponseMessageTransformer.cs b/src/WireMock.Net/Transformers/ResponseMessageTransformer.cs new file mode 100644 index 00000000..c53d1d5d --- /dev/null +++ b/src/WireMock.Net/Transformers/ResponseMessageTransformer.cs @@ -0,0 +1,33 @@ +using HandlebarsDotNet; +using System.Collections.Generic; + +namespace WireMock.Transformers +{ + internal static class ResponseMessageTransformer + { + public static ResponseMessage Transform(RequestMessage requestMessage, ResponseMessage original) + { + var responseMessage = new ResponseMessage { StatusCode = original.StatusCode, BodyOriginal = original.Body }; + + var template = new { request = requestMessage }; + + // Body + var templateBody = Handlebars.Compile(original.Body); + responseMessage.Body = templateBody(template); + + // Headers + var newHeaders = new Dictionary(); + foreach (var header in original.Headers) + { + var templateHeaderKey = Handlebars.Compile(header.Key); + var templateHeaderValue = Handlebars.Compile(header.Value); + + newHeaders.Add(templateHeaderKey(template), templateHeaderValue(template)); + } + + responseMessage.Headers = newHeaders; + + return responseMessage; + } + } +} \ No newline at end of file