diff --git a/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs b/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs
index e1574a65..b34d6dbd 100644
--- a/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs
+++ b/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs
@@ -358,6 +358,20 @@ namespace WireMock.Net.ConsoleApplication
.WithBody("linq match !!!")
);
+ server
+ .Given(Request.Create().WithPath("/myendpoint").UsingAnyMethod())
+ .RespondWith(Response.Create()
+ .WithStatusCode(500)
+ .WithBody(requestMessage =>
+ {
+ string returnStr = JsonConvert.SerializeObject(new
+ {
+ Message = "Test error"
+ });
+ return returnStr;
+ })
+ );
+
System.Console.WriteLine("Press any key to stop the server");
System.Console.ReadKey();
server.Stop();
diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs
index 48629d1e..714da3e3 100644
--- a/src/WireMock.Net/ResponseBuilders/Response.cs
+++ b/src/WireMock.Net/ResponseBuilders/Response.cs
@@ -169,7 +169,14 @@ namespace WireMock.ResponseBuilders
///
public IResponseBuilder WithBody(Func bodyFactory, string destination = BodyDestinationFormat.SameAsSource, Encoding encoding = null)
{
- return WithCallback(req => new ResponseMessage { Body = bodyFactory(req) });
+ Check.NotNull(bodyFactory, nameof(bodyFactory));
+
+ return WithCallback(req => new ResponseMessage
+ {
+ Body = bodyFactory(req),
+ BodyDestination = destination,
+ BodyEncoding = encoding ?? Encoding.UTF8
+ });
}
///
@@ -353,6 +360,22 @@ namespace WireMock.ResponseBuilders
await Task.Delay(Delay.Value);
}
+ if (Callback != null)
+ {
+ var callbackResponseMessage = Callback(requestMessage);
+
+ // Copy StatusCode from ResponseMessage
+ callbackResponseMessage.StatusCode = ResponseMessage.StatusCode;
+
+ // Copy Headers from ResponseMessage (if defined)
+ if (ResponseMessage.Headers != null)
+ {
+ callbackResponseMessage.Headers = ResponseMessage.Headers;
+ }
+
+ return callbackResponseMessage;
+ }
+
if (ProxyUrl != null && _httpClientForProxy != null)
{
var requestUri = new Uri(requestMessage.Url);
@@ -367,11 +390,7 @@ namespace WireMock.ResponseBuilders
return ResponseMessageTransformer.Transform(requestMessage, ResponseMessage);
}
- if (Callback != null)
- {
- return Callback(requestMessage);
- }
-
+ // Just return normal defined ResponseMessage
return ResponseMessage;
}
}
diff --git a/test/WireMock.Net.Tests/FluentMockServerTests.Admin.cs b/test/WireMock.Net.Tests/FluentMockServerTests.Admin.cs
index 5dbb11d3..b0dab914 100644
--- a/test/WireMock.Net.Tests/FluentMockServerTests.Admin.cs
+++ b/test/WireMock.Net.Tests/FluentMockServerTests.Admin.cs
@@ -48,15 +48,15 @@ namespace WireMock.Net.Tests
[Fact]
public void FluentMockServer_Admin_StartStop()
{
- var server1 = FluentMockServer.Start("http://localhost:9091");
+ var server1 = FluentMockServer.Start("http://localhost:19091");
- Check.That(server1.Urls[0]).Equals("http://localhost:9091");
+ Check.That(server1.Urls[0]).Equals("http://localhost:19091");
server1.Stop();
- var server2 = FluentMockServer.Start("http://localhost:9091/");
+ var server2 = FluentMockServer.Start("http://localhost:19091/");
- Check.That(server2.Urls[0]).Equals("http://localhost:9091/");
+ Check.That(server2.Urls[0]).Equals("http://localhost:19091/");
server2.Stop();
}
diff --git a/test/WireMock.Net.Tests/FluentMockServerTests.cs b/test/WireMock.Net.Tests/FluentMockServerTests.cs
index 596bef47..4de46636 100644
--- a/test/WireMock.Net.Tests/FluentMockServerTests.cs
+++ b/test/WireMock.Net.Tests/FluentMockServerTests.cs
@@ -106,7 +106,7 @@ namespace WireMock.Net.Tests
[Fact]
public async Task FluentMockServer_Should_respond_to_request_bodyAsCallback()
{
- // given
+ // Assign
var _server = FluentMockServer.Start();
_server
@@ -114,14 +114,18 @@ namespace WireMock.Net.Tests
.WithPath("/foo")
.UsingGet())
.RespondWith(Response.Create()
- .WithStatusCode(200)
- .WithBody(req => $"{{ path: '{req.Path}' }}"));
+ .WithStatusCode(500)
+ .WithHeader("H1", "X1")
+ .WithBody(req => $"path: {req.Path}"));
- // when
- var response = await new HttpClient().GetStringAsync("http://localhost:" + _server.Ports[0] + "/foo");
+ // Act
+ var response = await new HttpClient().GetAsync("http://localhost:" + _server.Ports[0] + "/foo");
- // then
- Check.That(response).IsEqualTo("{ path: '/foo' }");
+ // Assert
+ string content = await response.Content.ReadAsStringAsync();
+ Check.That(content).IsEqualTo("path: /foo");
+ Check.That((int) response.StatusCode).IsEqualTo(500);
+ Check.That(response.Headers.GetValues("H1")).ContainsExactly("X1");
}
[Fact]
diff --git a/test/WireMock.Net.Tests/ResponseBuilderTests/ResponseWithBodyTests.cs b/test/WireMock.Net.Tests/ResponseBuilderTests/ResponseWithBodyTests.cs
index 0d22dac6..a13e26c1 100644
--- a/test/WireMock.Net.Tests/ResponseBuilderTests/ResponseWithBodyTests.cs
+++ b/test/WireMock.Net.Tests/ResponseBuilderTests/ResponseWithBodyTests.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Text;
+using System.Text;
using System.Threading.Tasks;
using NFluent;
using WireMock.Models;
@@ -150,5 +149,30 @@ namespace WireMock.Net.Tests.ResponseBuilderTests
Check.That(((dynamic)responseMessage.BodyAsJson).value).Equals(42);
Check.That(responseMessage.BodyEncoding).Equals(Encoding.ASCII);
}
+
+ [Fact]
+ public async Task Response_ProvideResponse_WithBody_Func()
+ {
+ // Assign
+ var request = new RequestMessage(new UrlDetails("http://localhost/test"), "GET", ClientIp);
+
+ var response = Response.Create()
+ .WithStatusCode(500)
+ .WithHeader("H1", "X1")
+ .WithHeader("H2", "X2")
+ .WithBody(req => $"path: {req.Path}");
+
+ // Act
+ var responseMessage = await response.ProvideResponseAsync(request);
+
+ // Assert
+ Check.That(responseMessage.Body).IsEqualTo("path: /test");
+ Check.That(responseMessage.BodyAsBytes).IsNull();
+ Check.That(responseMessage.BodyAsJson).IsNull();
+ Check.That(responseMessage.BodyEncoding.CodePage).Equals(Encoding.UTF8.CodePage);
+ Check.That(responseMessage.StatusCode).IsEqualTo(500);
+ Check.That(responseMessage.Headers["H1"].ToString()).IsEqualTo("X1");
+ Check.That(responseMessage.Headers["H2"].ToString()).IsEqualTo("X2");
+ }
}
}
\ No newline at end of file