diff --git a/src/WireMock.Net/Admin/Mappings/EncodingModel.cs b/src/WireMock.Net/Admin/Mappings/EncodingModel.cs new file mode 100644 index 00000000..3987e3ca --- /dev/null +++ b/src/WireMock.Net/Admin/Mappings/EncodingModel.cs @@ -0,0 +1,23 @@ +using System.Text; + +namespace WireMock.Admin.Mappings +{ + /// + /// EncodingModel + /// + public class EncodingModel + { + /// + /// Encoding CodePage + /// + public int CodePage { get; set; } + /// + /// Encoding EncodingName + /// + public string EncodingName { get; set; } + /// + /// Encoding WebName + /// + public string WebName { get; set; } + } +} diff --git a/src/WireMock.Net/Admin/Mappings/ResponseModel.cs b/src/WireMock.Net/Admin/Mappings/ResponseModel.cs index 333db82b..f6c3fb27 100644 --- a/src/WireMock.Net/Admin/Mappings/ResponseModel.cs +++ b/src/WireMock.Net/Admin/Mappings/ResponseModel.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Text; namespace WireMock.Admin.Mappings { @@ -39,6 +40,14 @@ namespace WireMock.Admin.Mappings /// public object BodyAsJson { get; set; } + /// + /// Gets or sets the body encoding. + /// + /// + /// The body encoding. + /// + public EncodingModel BodyEncoding { get; set; } + /// /// Gets or sets a value indicating whether [use transformer]. /// diff --git a/src/WireMock.Net/Admin/Requests/LogRequestModel.cs b/src/WireMock.Net/Admin/Requests/LogRequestModel.cs index faa75c95..822e4d94 100644 --- a/src/WireMock.Net/Admin/Requests/LogRequestModel.cs +++ b/src/WireMock.Net/Admin/Requests/LogRequestModel.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Text; +using WireMock.Admin.Mappings; using WireMock.Util; namespace WireMock.Admin.Requests @@ -66,5 +68,13 @@ namespace WireMock.Admin.Requests /// The body. /// public string Body { get; set; } + + /// + /// Gets or sets the body encoding. + /// + /// + /// The body encoding. + /// + public EncodingModel BodyEncoding { get; set; } } } \ No newline at end of file diff --git a/src/WireMock.Net/Admin/Requests/LogResponseModel.cs b/src/WireMock.Net/Admin/Requests/LogResponseModel.cs index 1388ae4b..a5208da8 100644 --- a/src/WireMock.Net/Admin/Requests/LogResponseModel.cs +++ b/src/WireMock.Net/Admin/Requests/LogResponseModel.cs @@ -1,4 +1,6 @@ using System.Collections.Generic; +using System.Text; +using WireMock.Admin.Mappings; namespace WireMock.Admin.Requests { @@ -26,5 +28,10 @@ namespace WireMock.Admin.Requests /// Gets or sets the original body. /// public string BodyOriginal { get; set; } + + /// + /// Gets or sets the body. + /// + public EncodingModel BodyEncoding { get; set; } } } \ No newline at end of file diff --git a/src/WireMock.Net/HttpListenerRequestMapper.cs b/src/WireMock.Net/HttpListenerRequestMapper.cs index 2b055175..d0d6a948 100644 --- a/src/WireMock.Net/HttpListenerRequestMapper.cs +++ b/src/WireMock.Net/HttpListenerRequestMapper.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; +using System.Text; namespace WireMock { @@ -21,16 +22,16 @@ namespace WireMock Uri url = listenerRequest.Url; string verb = listenerRequest.HttpMethod; byte[] body = GetRequestBody(listenerRequest); - string bodyAsString = body != null ? listenerRequest.ContentEncoding.GetString(body) : null; + Encoding bodyEncoding = body != null ? listenerRequest.ContentEncoding : null; + string bodyAsString = bodyEncoding?.GetString(body); var listenerHeaders = listenerRequest.Headers; var headers = listenerHeaders.AllKeys.ToDictionary(k => k, k => listenerHeaders[k]); var cookies = new Dictionary(); + foreach (Cookie cookie in listenerRequest.Cookies) cookies.Add(cookie.Name, cookie.Value); - var message = new RequestMessage(url, verb, body, bodyAsString, headers, cookies) { DateTime = DateTime.Now }; - - return message; + return new RequestMessage(url, verb, body, bodyAsString, bodyEncoding, headers, cookies) { DateTime = DateTime.Now }; } /// diff --git a/src/WireMock.Net/HttpListenerResponseMapper.cs b/src/WireMock.Net/HttpListenerResponseMapper.cs index 6a0897b8..f7f5e28b 100644 --- a/src/WireMock.Net/HttpListenerResponseMapper.cs +++ b/src/WireMock.Net/HttpListenerResponseMapper.cs @@ -24,14 +24,16 @@ namespace WireMock responseMessage.Headers.ToList().ForEach(pair => listenerResponse.AddHeader(pair.Key, pair.Value)); - if (responseMessage.Body != null) - { - byte[] buffer = _utf8NoBom.GetBytes(responseMessage.Body); - listenerResponse.ContentEncoding = _utf8NoBom; - listenerResponse.ContentLength64 = buffer.Length; - listenerResponse.OutputStream.Write(buffer, 0, buffer.Length); - listenerResponse.OutputStream.Flush(); - } + if (responseMessage.Body == null) + return; + + var encoding = responseMessage.BodyEncoding ?? _utf8NoBom; + byte[] buffer = encoding.GetBytes(responseMessage.Body); + + listenerResponse.ContentEncoding = encoding; + listenerResponse.ContentLength64 = buffer.Length; + listenerResponse.OutputStream.Write(buffer, 0, buffer.Length); + listenerResponse.OutputStream.Flush(); } } } \ No newline at end of file diff --git a/src/WireMock.Net/RequestMessage.cs b/src/WireMock.Net/RequestMessage.cs index b4f82ce7..3f6f4b3e 100644 --- a/src/WireMock.Net/RequestMessage.cs +++ b/src/WireMock.Net/RequestMessage.cs @@ -4,6 +4,7 @@ using System.Linq; using JetBrains.Annotations; using WireMock.Util; using WireMock.Validation; +using System.Text; namespace WireMock { @@ -57,6 +58,11 @@ namespace WireMock /// public string Body { get; } + /// + /// Gets the body encoding. + /// + public Encoding BodyEncoding { get; } + /// /// Initializes a new instance of the class. /// @@ -64,9 +70,10 @@ namespace WireMock /// The verb. /// The bodyAsBytes byte[]. /// The body string. + /// The body encoding /// The headers. /// The cookies. - public RequestMessage([NotNull] Uri url, [NotNull] string verb, [CanBeNull] byte[] bodyAsBytes = null, [CanBeNull] string body = null, [CanBeNull] IDictionary headers = null, [CanBeNull] IDictionary cookies = null) + public RequestMessage([NotNull] Uri url, [NotNull] string verb, [CanBeNull] byte[] bodyAsBytes = null, [CanBeNull] string body = null, [CanBeNull] Encoding bodyEncoding = null, [CanBeNull] IDictionary headers = null, [CanBeNull] IDictionary cookies = null) { Check.NotNull(url, nameof(url)); Check.NotNull(verb, nameof(verb)); @@ -76,6 +83,7 @@ namespace WireMock Method = verb.ToLower(); BodyAsBytes = bodyAsBytes; Body = body; + BodyEncoding = bodyEncoding; Headers = headers; Cookies = cookies; diff --git a/src/WireMock.Net/ResponseBuilders/IBodyResponseBuilder.cs b/src/WireMock.Net/ResponseBuilders/IBodyResponseBuilder.cs index 8c589be4..4b4841af 100644 --- a/src/WireMock.Net/ResponseBuilders/IBodyResponseBuilder.cs +++ b/src/WireMock.Net/ResponseBuilders/IBodyResponseBuilder.cs @@ -12,15 +12,17 @@ namespace WireMock.ResponseBuilders /// The with body. /// /// The body. + /// The body encoding. /// A . - IResponseBuilder WithBody([NotNull] string body); + IResponseBuilder WithBody([NotNull] string body, [CanBeNull] Encoding encoding = null); /// /// The with body. /// /// The body. + /// The body encoding. /// A . - IResponseBuilder WithBodyAsJson([NotNull] object body); + IResponseBuilder WithBodyAsJson([NotNull] object body, [CanBeNull] Encoding encoding = null); /// /// The with body as base64. diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index 4209d0aa..b0351c8e 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -143,12 +143,15 @@ namespace WireMock.ResponseBuilders /// The with body. /// /// The body. + /// The body encoding. /// A . - public IResponseBuilder WithBody(string body) + public IResponseBuilder WithBody(string body, Encoding encoding = null) { Check.NotNull(body, nameof(body)); ResponseMessage.Body = body; + ResponseMessage.BodyEncoding = encoding ?? Encoding.UTF8; + return this; } @@ -156,12 +159,22 @@ namespace WireMock.ResponseBuilders /// The with body (AsJson object). /// /// The body. + /// The body encoding. /// A . - public IResponseBuilder WithBodyAsJson(object body) + public IResponseBuilder WithBodyAsJson(object body, Encoding encoding = null) { Check.NotNull(body, nameof(body)); - ResponseMessage.Body = JsonConvert.SerializeObject(body, new JsonSerializerSettings { Formatting = Formatting.None, NullValueHandling = NullValueHandling.Ignore }); + string jsonBody = JsonConvert.SerializeObject(body, new JsonSerializerSettings { Formatting = Formatting.None, NullValueHandling = NullValueHandling.Ignore }); + + if (encoding != null && !encoding.Equals(Encoding.UTF8)) + { + jsonBody = encoding.GetString(Encoding.UTF8.GetBytes(jsonBody)); + ResponseMessage.BodyEncoding = encoding; + } + + ResponseMessage.Body = jsonBody; + return this; } @@ -175,7 +188,11 @@ namespace WireMock.ResponseBuilders { Check.NotNull(bodyAsbase64, nameof(bodyAsbase64)); - ResponseMessage.Body = (encoding ?? Encoding.UTF8).GetString(Convert.FromBase64String(bodyAsbase64)); + encoding = encoding ?? Encoding.UTF8; + + ResponseMessage.Body = encoding.GetString(Convert.FromBase64String(bodyAsbase64)); + ResponseMessage.BodyEncoding = encoding; + return this; } diff --git a/src/WireMock.Net/ResponseMessage.cs b/src/WireMock.Net/ResponseMessage.cs index ed9e8a56..b60ed2ce 100644 --- a/src/WireMock.Net/ResponseMessage.cs +++ b/src/WireMock.Net/ResponseMessage.cs @@ -1,5 +1,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; +using System.Text; + namespace WireMock { /// @@ -27,6 +29,11 @@ namespace WireMock /// public string Body { get; set; } + /// + /// Gets or sets the body encoding. + /// + public Encoding BodyEncoding { get; set; } = new UTF8Encoding(false); + /// /// The add header. /// diff --git a/src/WireMock.Net/Server/FluentMockServer.Admin.cs b/src/WireMock.Net/Server/FluentMockServer.Admin.cs index f884e5c7..4a463f4d 100644 --- a/src/WireMock.Net/Server/FluentMockServer.Admin.cs +++ b/src/WireMock.Net/Server/FluentMockServer.Admin.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text; using JetBrains.Annotations; using Newtonsoft.Json; using SimMetrics.Net; @@ -292,14 +293,26 @@ namespace WireMock.Server Method = logEntry.RequestMessage.Method, Body = logEntry.RequestMessage.Body, Headers = logEntry.RequestMessage.Headers, - Cookies = logEntry.RequestMessage.Cookies + Cookies = logEntry.RequestMessage.Cookies, + BodyEncoding = logEntry.RequestMessage.BodyEncoding != null ? new EncodingModel + { + EncodingName = logEntry.RequestMessage.BodyEncoding.EncodingName, + CodePage = logEntry.RequestMessage.BodyEncoding.CodePage, + WebName = logEntry.RequestMessage.BodyEncoding.WebName + } : null }, Response = new LogResponseModel { StatusCode = logEntry.ResponseMessage.StatusCode, Body = logEntry.ResponseMessage.Body, BodyOriginal = logEntry.ResponseMessage.BodyOriginal, - Headers = logEntry.ResponseMessage.Headers + Headers = logEntry.ResponseMessage.Headers, + BodyEncoding = logEntry.ResponseMessage.BodyEncoding != null ? new EncodingModel + { + EncodingName = logEntry.ResponseMessage.BodyEncoding.EncodingName, + CodePage = logEntry.ResponseMessage.BodyEncoding.CodePage, + WebName = logEntry.ResponseMessage.BodyEncoding.WebName + } : null }, MappingGuid = logEntry.MappingGuid, RequestMatchResult = logEntry.RequestMatchResult != null ? new LogRequestMatchModel @@ -418,11 +431,11 @@ namespace WireMock.Server responseBuilder = responseBuilder.WithHeaders(responseModel.Headers); if (responseModel.Body != null) - responseBuilder = responseBuilder.WithBody(responseModel.Body); + responseBuilder = responseBuilder.WithBody(responseModel.Body, ToEncoding(responseModel.BodyEncoding)); else if (responseModel.BodyAsJson != null) - responseBuilder = responseBuilder.WithBodyAsJson(responseModel.BodyAsJson); + responseBuilder = responseBuilder.WithBodyAsJson(responseModel.BodyAsJson, ToEncoding(responseModel.BodyEncoding)); else if (responseModel.BodyAsBase64 != null) - responseBuilder = responseBuilder.WithBodyAsBase64(responseModel.BodyAsBase64); + responseBuilder = responseBuilder.WithBodyAsBase64(responseModel.BodyAsBase64, ToEncoding(responseModel.BodyEncoding)); if (responseModel.UseTransformer) responseBuilder = responseBuilder.WithTransformer(); @@ -500,7 +513,14 @@ namespace WireMock.Server Headers = response.ResponseMessage.Headers, Body = response.ResponseMessage.Body, UseTransformer = response.UseTransformer, - Delay = response.Delay?.Milliseconds + Delay = response.Delay?.Milliseconds, + + BodyEncoding = response.ResponseMessage.BodyEncoding != null ? new EncodingModel + { + EncodingName = response.ResponseMessage.BodyEncoding.EncodingName, + CodePage = response.ResponseMessage.BodyEncoding.CodePage, + WebName = response.ResponseMessage.BodyEncoding.WebName + } : null } }; } @@ -590,5 +610,10 @@ namespace WireMock.Server Headers = new Dictionary { { "Content-Type", "application/json" } } }; } + + private Encoding ToEncoding(EncodingModel encodingModel) + { + return encodingModel != null ? Encoding.GetEncoding(encodingModel.CodePage) : null; + } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/HttpListenerResponseMapperTests.cs b/test/WireMock.Net.Tests/HttpListenerResponseMapperTests.cs index cd0326c6..132e644e 100644 --- a/test/WireMock.Net.Tests/HttpListenerResponseMapperTests.cs +++ b/test/WireMock.Net.Tests/HttpListenerResponseMapperTests.cs @@ -1,5 +1,6 @@ using System.Net; using System.Net.Http; +using System.Text; using System.Threading; using System.Threading.Tasks; using NFluent; @@ -67,6 +68,31 @@ namespace WireMock.Net.Tests Check.That(contentTask.Result).IsEqualTo("Hello !!!"); } + [Test] + public void Should_map_encoded_body_from_original_response() + { + // given + var response = new ResponseMessage + { + Body = "Hello !!!", + BodyEncoding = Encoding.ASCII + }; + + var httpListenerResponse = CreateHttpListenerResponse(); + + // when + new HttpListenerResponseMapper().Map(response, httpListenerResponse); + + // then + Check.That(httpListenerResponse.ContentEncoding).Equals(Encoding.ASCII); + + var responseMessage = ToResponseMessage(httpListenerResponse); + Check.That(responseMessage).IsNotNull(); + + var contentTask = responseMessage.Content.ReadAsStringAsync(); + Check.That(contentTask.Result).IsEqualTo("Hello !!!"); + } + [TearDown] public void StopServer() { diff --git a/test/WireMock.Net.Tests/RequestMessageTests.cs b/test/WireMock.Net.Tests/RequestMessageTests.cs index 2e74c704..26b61236 100644 --- a/test/WireMock.Net.Tests/RequestMessageTests.cs +++ b/test/WireMock.Net.Tests/RequestMessageTests.cs @@ -24,7 +24,7 @@ namespace WireMock.Net.Tests // given string bodyAsString = "whatever"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost?foo=bar&multi=1&multi=2"), "POST", body, bodyAsString); + var request = new RequestMessage(new Uri("http://localhost?foo=bar&multi=1&multi=2"), "POST", body, bodyAsString, Encoding.UTF8); // then Check.That(request.GetParameter("foo")).Contains("bar"); diff --git a/test/WireMock.Net.Tests/RequestTests.cs b/test/WireMock.Net.Tests/RequestTests.cs index c973c1ca..033a6a9d 100644 --- a/test/WireMock.Net.Tests/RequestTests.cs +++ b/test/WireMock.Net.Tests/RequestTests.cs @@ -146,7 +146,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "whatever"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "Delete", body, bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "Delete", body, bodyAsString, Encoding.UTF8); // then var requestMatchResult = new RequestMatchResult(); @@ -204,7 +204,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "whatever"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, new Dictionary { { "X-toto", "tata" } }); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, Encoding.UTF8, new Dictionary { { "X-toto", "tata" } }); // then var requestMatchResult = new RequestMatchResult(); @@ -220,7 +220,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "whatever"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, new Dictionary { { "X-toto", "tata" } }); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, Encoding.UTF8, new Dictionary { { "X-toto", "tata" } }); // then var requestMatchResult = new RequestMatchResult(); @@ -236,7 +236,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "whatever"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, new Dictionary { { "X-toto", "ABC" } }); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, Encoding.UTF8, new Dictionary { { "X-toto", "ABC" } }); // then var requestMatchResult = new RequestMatchResult(); @@ -252,7 +252,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "whatever"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, new Dictionary { { "X-toto", "TaTa" } }); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, Encoding.UTF8, new Dictionary { { "X-toto", "TaTa" } }); // then var requestMatchResult = new RequestMatchResult(); @@ -266,7 +266,7 @@ namespace WireMock.Net.Tests var spec = Request.Create().UsingAnyVerb().WithCookie("session", "a*"); // when - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", null, null, null, new Dictionary { { "session", "abc" } }); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", null, null, null, null, new Dictionary { { "session", "abc" } }); // then var requestMatchResult = new RequestMatchResult(); @@ -282,7 +282,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "Hello world!"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, Encoding.UTF8); // then var requestMatchResult = new RequestMatchResult(); @@ -298,7 +298,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "cat"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString, Encoding.UTF8); // then var requestMatchResult = new RequestMatchResult(); @@ -314,7 +314,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "cat"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString, Encoding.UTF8); // then var requestMatchResult = new RequestMatchResult(); @@ -330,7 +330,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "caR"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString, Encoding.UTF8); // then var requestMatchResult = new RequestMatchResult(); @@ -346,7 +346,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "The car drives in the street."; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString, Encoding.UTF8); // then var requestMatchResult = new RequestMatchResult(); @@ -362,7 +362,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "Hello"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString, Encoding.UTF8); // then var requestMatchResult = new RequestMatchResult(); @@ -378,7 +378,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "Hello world!"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, new Dictionary { { "X-toto", "tatata" } }); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, Encoding.UTF8, new Dictionary { { "X-toto", "tatata" } }); // then var requestMatchResult = new RequestMatchResult(); @@ -394,7 +394,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "Hello world!"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, Encoding.UTF8); // then var requestMatchResult = new RequestMatchResult(); @@ -415,7 +415,7 @@ namespace WireMock.Net.Tests xyz "; byte[] body = Encoding.UTF8.GetBytes(xmlBodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, xmlBodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, xmlBodyAsString, Encoding.UTF8); // then var requestMatchResult = new RequestMatchResult(); @@ -436,7 +436,7 @@ namespace WireMock.Net.Tests xyz "; byte[] body = Encoding.UTF8.GetBytes(xmlBodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, xmlBodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, xmlBodyAsString, Encoding.UTF8); // then var requestMatchResult = new RequestMatchResult(); @@ -452,7 +452,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "{ \"things\": [ { \"name\": \"RequiredThing\" }, { \"name\": \"Wiremock\" } ] }"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, Encoding.UTF8); // then var requestMatchResult = new RequestMatchResult(); @@ -468,7 +468,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "{ \"things\": { \"name\": \"Wiremock\" } }"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, Encoding.UTF8); // then var requestMatchResult = new RequestMatchResult(); @@ -484,7 +484,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "xxx"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, new Dictionary { { "X-toto", "tatata" } }); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", body, bodyAsString, Encoding.UTF8, new Dictionary { { "X-toto", "tatata" } }); // then var requestMatchResult = new RequestMatchResult(); diff --git a/test/WireMock.Net.Tests/ResponseTests.cs b/test/WireMock.Net.Tests/ResponseTests.cs index 663c6ed9..a0b7bd44 100644 --- a/test/WireMock.Net.Tests/ResponseTests.cs +++ b/test/WireMock.Net.Tests/ResponseTests.cs @@ -17,7 +17,7 @@ namespace WireMock.Net.Tests // given string bodyAsString = "abc"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString, Encoding.UTF8); var response = Response.Create() .WithBody("test {{request.url}} {{request.path}} {{request.method}}") @@ -36,7 +36,7 @@ namespace WireMock.Net.Tests // given string bodyAsString = "abc"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo?a=1&a=2&b=5"), "POST", body, bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo?a=1&a=2&b=5"), "POST", body, bodyAsString, Encoding.UTF8); var response = Response.Create() .WithBody("test keya={{request.query.a}} idx={{request.query.a.[0]}} idx={{request.query.a.[1]}} keyb={{request.query.b}}") @@ -55,7 +55,7 @@ namespace WireMock.Net.Tests // given string bodyAsString = "abc"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString, new Dictionary { { "Content-Type", "text/plain" } }); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString, Encoding.UTF8, new Dictionary { { "Content-Type", "text/plain" } }); var response = Response.Create().WithHeader("x", "{{request.headers.Content-Type}}").WithBody("test").WithTransformer(); @@ -66,5 +66,41 @@ namespace WireMock.Net.Tests Check.That(responseMessage.Body).Equals("test"); Check.That(responseMessage.Headers).Contains(new KeyValuePair("x", "text/plain")); } + + [Test] + public async Task Response_ProvideResponse_Encoding_Body() + { + // given + string bodyAsString = "abc"; + byte[] body = Encoding.UTF8.GetBytes(bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString, Encoding.UTF8); + + var response = Response.Create().WithBody("test", Encoding.ASCII); + + // act + var responseMessage = await response.ProvideResponse(request); + + // then + Check.That(responseMessage.Body).Equals("test"); + Check.That(responseMessage.BodyEncoding).Equals(Encoding.ASCII); + } + + [Test] + public async Task Response_ProvideResponse_Encoding_JsonBody() + { + // given + string bodyAsString = "abc"; + byte[] body = Encoding.UTF8.GetBytes(bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString, Encoding.UTF8); + + var response = Response.Create().WithBodyAsJson(new { value = "test" }, Encoding.ASCII); + + // act + var responseMessage = await response.ProvideResponse(request); + + // then + Check.That(responseMessage.Body).Equals("{\"value\":\"test\"}"); + Check.That(responseMessage.BodyEncoding).Equals(Encoding.ASCII); + } } } \ No newline at end of file