diff --git a/README.md b/README.md index f6d2ae0e..5cd9d7b8 100644 --- a/README.md +++ b/README.md @@ -315,7 +315,7 @@ The mappings defined in the mock service. ### /__admin/requests Logged requests and responses received by the mock service. -* `GET /__admin/requests` --> TODO +* `GET /__admin/requests` --> Get received requests * `GET /__admin/requests/{requestId}` --> TODO * `POST /__admin/requests/reset` --> TODO * `POST /__admin/requests/count` --> TODO diff --git a/examples/WireMock.Net.ConsoleApplication/Program.cs b/examples/WireMock.Net.ConsoleApplication/Program.cs index fa1df233..0ba61fbb 100644 --- a/examples/WireMock.Net.ConsoleApplication/Program.cs +++ b/examples/WireMock.Net.ConsoleApplication/Program.cs @@ -82,7 +82,7 @@ namespace WireMock.Net.ConsoleApplication Console.ReadKey(); Console.WriteLine("Displaying all requests"); - var allRequests = server.RequestLogs; + var allRequests = server.LogEntries; Console.WriteLine(JsonConvert.SerializeObject(allRequests, Formatting.Indented)); Console.WriteLine("Press any key to quit"); diff --git a/src/WireMock.Net/Admin/BodyModel.cs b/src/WireMock.Net/Admin/Mappings/BodyModel.cs similarity index 88% rename from src/WireMock.Net/Admin/BodyModel.cs rename to src/WireMock.Net/Admin/Mappings/BodyModel.cs index ac0dfd0e..565c3dfa 100644 --- a/src/WireMock.Net/Admin/BodyModel.cs +++ b/src/WireMock.Net/Admin/Mappings/BodyModel.cs @@ -1,4 +1,4 @@ -namespace WireMock.Admin +namespace WireMock.Admin.Mappings { /// /// Body Model diff --git a/src/WireMock.Net/Admin/CookieModel.cs b/src/WireMock.Net/Admin/Mappings/CookieModel.cs similarity index 93% rename from src/WireMock.Net/Admin/CookieModel.cs rename to src/WireMock.Net/Admin/Mappings/CookieModel.cs index 68807650..dfbaef30 100644 --- a/src/WireMock.Net/Admin/CookieModel.cs +++ b/src/WireMock.Net/Admin/Mappings/CookieModel.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace WireMock.Admin +namespace WireMock.Admin.Mappings { /// /// Cookie Model diff --git a/src/WireMock.Net/Admin/FuncModel.cs b/src/WireMock.Net/Admin/Mappings/FuncModel.cs similarity index 100% rename from src/WireMock.Net/Admin/FuncModel.cs rename to src/WireMock.Net/Admin/Mappings/FuncModel.cs diff --git a/src/WireMock.Net/Admin/HeaderModel.cs b/src/WireMock.Net/Admin/Mappings/HeaderModel.cs similarity index 93% rename from src/WireMock.Net/Admin/HeaderModel.cs rename to src/WireMock.Net/Admin/Mappings/HeaderModel.cs index 262c699f..855036a6 100644 --- a/src/WireMock.Net/Admin/HeaderModel.cs +++ b/src/WireMock.Net/Admin/Mappings/HeaderModel.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace WireMock.Admin +namespace WireMock.Admin.Mappings { /// /// Header Model diff --git a/src/WireMock.Net/Admin/MappingModel.cs b/src/WireMock.Net/Admin/Mappings/MappingModel.cs similarity index 95% rename from src/WireMock.Net/Admin/MappingModel.cs rename to src/WireMock.Net/Admin/Mappings/MappingModel.cs index 3b5ea4ca..6ce00853 100644 --- a/src/WireMock.Net/Admin/MappingModel.cs +++ b/src/WireMock.Net/Admin/Mappings/MappingModel.cs @@ -1,6 +1,6 @@ using System; -namespace WireMock.Admin +namespace WireMock.Admin.Mappings { /// /// MappingModel diff --git a/src/WireMock.Net/Admin/MatcherModel.cs b/src/WireMock.Net/Admin/Mappings/MatcherModel.cs similarity index 92% rename from src/WireMock.Net/Admin/MatcherModel.cs rename to src/WireMock.Net/Admin/Mappings/MatcherModel.cs index 56f5106d..790188e2 100644 --- a/src/WireMock.Net/Admin/MatcherModel.cs +++ b/src/WireMock.Net/Admin/Mappings/MatcherModel.cs @@ -1,4 +1,4 @@ -namespace WireMock.Admin +namespace WireMock.Admin.Mappings { /// /// MatcherModel diff --git a/src/WireMock.Net/Admin/ParamModel.cs b/src/WireMock.Net/Admin/Mappings/ParamModel.cs similarity index 93% rename from src/WireMock.Net/Admin/ParamModel.cs rename to src/WireMock.Net/Admin/Mappings/ParamModel.cs index e4c85bc1..28c3a58e 100644 --- a/src/WireMock.Net/Admin/ParamModel.cs +++ b/src/WireMock.Net/Admin/Mappings/ParamModel.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace WireMock.Admin +namespace WireMock.Admin.Mappings { /// /// Param Model diff --git a/src/WireMock.Net/Admin/RequestModel.cs b/src/WireMock.Net/Admin/Mappings/RequestModel.cs similarity index 91% rename from src/WireMock.Net/Admin/RequestModel.cs rename to src/WireMock.Net/Admin/Mappings/RequestModel.cs index cdc2b08d..d70d79d3 100644 --- a/src/WireMock.Net/Admin/RequestModel.cs +++ b/src/WireMock.Net/Admin/Mappings/RequestModel.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace WireMock.Admin +namespace WireMock.Admin.Mappings { /// /// RequestModel @@ -16,9 +16,9 @@ namespace WireMock.Admin public UrlModel Url { get; set; } /// - /// The verbs + /// The methods /// - public string[] Verbs { get; set; } + public string[] Methods { get; set; } /// /// Gets or sets the Headers. diff --git a/src/WireMock.Net/Admin/ResponseModel.cs b/src/WireMock.Net/Admin/Mappings/ResponseModel.cs similarity index 95% rename from src/WireMock.Net/Admin/ResponseModel.cs rename to src/WireMock.Net/Admin/Mappings/ResponseModel.cs index cd7551dd..b5e6c8f8 100644 --- a/src/WireMock.Net/Admin/ResponseModel.cs +++ b/src/WireMock.Net/Admin/Mappings/ResponseModel.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace WireMock.Admin +namespace WireMock.Admin.Mappings { /// /// ResponseModel diff --git a/src/WireMock.Net/Admin/UrlModel.cs b/src/WireMock.Net/Admin/Mappings/UrlModel.cs similarity index 90% rename from src/WireMock.Net/Admin/UrlModel.cs rename to src/WireMock.Net/Admin/Mappings/UrlModel.cs index 77164271..fd7af3e4 100644 --- a/src/WireMock.Net/Admin/UrlModel.cs +++ b/src/WireMock.Net/Admin/Mappings/UrlModel.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace WireMock.Admin +namespace WireMock.Admin.Mappings { /// /// UrlModel diff --git a/src/WireMock.Net/Admin/Requests/LogEntryModel.cs b/src/WireMock.Net/Admin/Requests/LogEntryModel.cs new file mode 100644 index 00000000..a32e8555 --- /dev/null +++ b/src/WireMock.Net/Admin/Requests/LogEntryModel.cs @@ -0,0 +1,24 @@ +namespace WireMock.Admin.Requests +{ + /// + /// Request Log Model + /// + public class LogEntryModel + { + /// + /// Gets or sets the request. + /// + /// + /// The request. + /// + public LogRequestModel Request { get; set; } + + /// + /// Gets or sets the response. + /// + /// + /// The response. + /// + public LogResponseModel Response { get; set; } + } +} \ No newline at end of file diff --git a/src/WireMock.Net/Admin/Requests/LogRequestModel.cs b/src/WireMock.Net/Admin/Requests/LogRequestModel.cs new file mode 100644 index 00000000..6055aa33 --- /dev/null +++ b/src/WireMock.Net/Admin/Requests/LogRequestModel.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using WireMock.Util; + +namespace WireMock.Admin.Requests +{ + /// + /// RequestMessage Model + /// + public class LogRequestModel + { + /// + /// Gets or sets the unique identifier. + /// + /// + /// The unique identifier. + /// + public Guid Guid { get; set; } + + /// + /// Gets the DateTime. + /// + public DateTime DateTime { get; set; } + + /// + /// Gets or sets the URL. + /// + /// + /// The URL. + /// + public string Url { get; set; } + + /// + /// Gets or sets the absolete URL. + /// + /// + /// The absolete URL. + /// + public string AbsoleteUrl { get; set; } + + /// + /// Gets the query. + /// + public IDictionary> Query { get; set; } + + /// + /// Gets or sets the method. + /// + /// + /// The method. + /// + public string Method { get; set; } + + /// + /// Gets or sets the Headers. + /// + /// + /// The Headers. + /// + public IDictionary Headers { get; set; } + + /// + /// Gets or sets the Cookies. + /// + /// + /// The Cookies. + /// + public IDictionary Cookies { get; set; } + + /// + /// Gets or sets the body. + /// + /// + /// The body. + /// + public string Body { get; set; } + + /* + "id" : "45760a03-eebb-4387-ad0d-bb89b5d3d662", + "request" : { + "url" : "/received-request/9", + "absoluteUrl" : "http://localhost:56715/received-request/9", + "method" : "GET", + "clientIp" : "127.0.0.1", + "headers" : { + "Connection" : "keep-alive", + "Host" : "localhost:56715", + "User-Agent" : "Apache-HttpClient/4.5.1 (Java/1.7.0_51)" + }, + "cookies" : { }, + "browserProxyRequest" : false, + "loggedDate" : 1471442494809, + "bodyAsBase64" : "", + "body" : "", + "loggedDateString" : "2016-08-17T14:01:34Z" + }, + "responseDefinition" : { + "status" : 404, + "transformers" : [ ], + "fromConfiguredStub" : false, + "transformerParameters" : { } + }*/ + } +} \ No newline at end of file diff --git a/src/WireMock.Net/Admin/Requests/LogResponseModel.cs b/src/WireMock.Net/Admin/Requests/LogResponseModel.cs new file mode 100644 index 00000000..1388ae4b --- /dev/null +++ b/src/WireMock.Net/Admin/Requests/LogResponseModel.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; + +namespace WireMock.Admin.Requests +{ + /// + /// Response MessageModel + /// + public class LogResponseModel + { + /// + /// Gets or sets the status code. + /// + public int StatusCode { get; set; } = 200; + + /// + /// Gets the headers. + /// + public IDictionary Headers { get; set; } + + /// + /// Gets or sets the body. + /// + public string Body { get; set; } + + /// + /// Gets or sets the original body. + /// + public string BodyOriginal { get; set; } + } +} \ No newline at end of file diff --git a/src/WireMock.Net/HttpListenerRequestMapper.cs b/src/WireMock.Net/HttpListenerRequestMapper.cs index 9146f99c..2b055175 100644 --- a/src/WireMock.Net/HttpListenerRequestMapper.cs +++ b/src/WireMock.Net/HttpListenerRequestMapper.cs @@ -28,7 +28,9 @@ namespace WireMock foreach (Cookie cookie in listenerRequest.Cookies) cookies.Add(cookie.Name, cookie.Value); - return new RequestMessage(url, verb, body, bodyAsString, headers, cookies); + var message = new RequestMessage(url, verb, body, bodyAsString, headers, cookies) { DateTime = DateTime.Now }; + + return message; } /// diff --git a/src/WireMock.Net/Logging/LogEntry.cs b/src/WireMock.Net/Logging/LogEntry.cs new file mode 100644 index 00000000..fd71a897 --- /dev/null +++ b/src/WireMock.Net/Logging/LogEntry.cs @@ -0,0 +1,24 @@ +namespace WireMock.Logging +{ + /// + /// LogEntry + /// + public class LogEntry + { + /// + /// Gets or sets the request message. + /// + /// + /// The request message. + /// + public RequestMessage RequestMessage { get; set; } + + /// + /// Gets or sets the response message. + /// + /// + /// The response message. + /// + public ResponseMessage ResponseMessage { get; set; } + } +} \ No newline at end of file diff --git a/src/WireMock.Net/RouteRegistrationCallback.cs b/src/WireMock.Net/MappingRegistrationCallback.cs similarity index 100% rename from src/WireMock.Net/RouteRegistrationCallback.cs rename to src/WireMock.Net/MappingRegistrationCallback.cs diff --git a/src/WireMock.Net/Matchers/Request/RequestMessageVerbMatcher.cs b/src/WireMock.Net/Matchers/Request/RequestMessageMethodMatcher.cs similarity index 64% rename from src/WireMock.Net/Matchers/Request/RequestMessageVerbMatcher.cs rename to src/WireMock.Net/Matchers/Request/RequestMessageMethodMatcher.cs index 7ef8d01b..e4759afc 100644 --- a/src/WireMock.Net/Matchers/Request/RequestMessageVerbMatcher.cs +++ b/src/WireMock.Net/Matchers/Request/RequestMessageMethodMatcher.cs @@ -7,23 +7,23 @@ namespace WireMock.Matchers.Request /// /// The request verb matcher. /// - internal class RequestMessageVerbMatcher : IRequestMatcher + internal class RequestMessageMethodMatcher : IRequestMatcher { /// - /// The verbs + /// The methods /// - public string[] Verbs { get; } + public string[] Methods { get; } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - /// + /// /// The verb. /// - public RequestMessageVerbMatcher([NotNull] params string[] verbs) + public RequestMessageMethodMatcher([NotNull] params string[] methods) { - Check.NotNull(verbs, nameof(verbs)); - Verbs = verbs.Select(v => v.ToLower()).ToArray(); + Check.NotNull(methods, nameof(methods)); + Methods = methods.Select(v => v.ToLower()).ToArray(); } /// @@ -35,7 +35,7 @@ namespace WireMock.Matchers.Request /// public bool IsMatch(RequestMessage requestMessage) { - return Verbs.Contains(requestMessage.Verb); + return Methods.Contains(requestMessage.Method); } } } \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/IVerbRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs similarity index 93% rename from src/WireMock.Net/RequestBuilders/IVerbRequestBuilder.cs rename to src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs index e89d3cb6..64c28952 100644 --- a/src/WireMock.Net/RequestBuilders/IVerbRequestBuilder.cs +++ b/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs @@ -3,9 +3,9 @@ namespace WireMock.RequestBuilders { /// - /// The VerbRequestBuilder interface. + /// The MethodRequestBuilder interface. /// - public interface IVerbRequestBuilder : IHeadersAndCookiesRequestBuilder + public interface IMethodRequestBuilder : IHeadersAndCookiesRequestBuilder { /// /// The using get. diff --git a/src/WireMock.Net/RequestBuilders/IUrlAndPathRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IUrlAndPathRequestBuilder.cs index 0f93c4e6..6093ad55 100644 --- a/src/WireMock.Net/RequestBuilders/IUrlAndPathRequestBuilder.cs +++ b/src/WireMock.Net/RequestBuilders/IUrlAndPathRequestBuilder.cs @@ -7,7 +7,7 @@ namespace WireMock.RequestBuilders /// /// IUrlAndPathRequestBuilder /// - public interface IUrlAndPathRequestBuilder : IVerbRequestBuilder + public interface IUrlAndPathRequestBuilder : IMethodRequestBuilder { /// /// The with url. diff --git a/src/WireMock.Net/RequestBuilders/Request.cs b/src/WireMock.Net/RequestBuilders/Request.cs index 249ce344..9c613a5b 100644 --- a/src/WireMock.Net/RequestBuilders/Request.cs +++ b/src/WireMock.Net/RequestBuilders/Request.cs @@ -127,7 +127,7 @@ namespace WireMock.RequestBuilders /// public IHeadersAndCookiesRequestBuilder UsingGet() { - _requestMatchers.Add(new RequestMessageVerbMatcher("get")); + _requestMatchers.Add(new RequestMessageMethodMatcher("get")); return this; } @@ -139,7 +139,7 @@ namespace WireMock.RequestBuilders /// public IHeadersAndCookiesRequestBuilder UsingPost() { - _requestMatchers.Add(new RequestMessageVerbMatcher("post")); + _requestMatchers.Add(new RequestMessageMethodMatcher("post")); return this; } @@ -151,7 +151,7 @@ namespace WireMock.RequestBuilders /// public IHeadersAndCookiesRequestBuilder UsingPut() { - _requestMatchers.Add(new RequestMessageVerbMatcher("put")); + _requestMatchers.Add(new RequestMessageMethodMatcher("put")); return this; } @@ -163,7 +163,7 @@ namespace WireMock.RequestBuilders /// public IHeadersAndCookiesRequestBuilder UsingDelete() { - _requestMatchers.Add(new RequestMessageVerbMatcher("delete")); + _requestMatchers.Add(new RequestMessageMethodMatcher("delete")); return this; } @@ -175,7 +175,7 @@ namespace WireMock.RequestBuilders /// public IHeadersAndCookiesRequestBuilder UsingHead() { - _requestMatchers.Add(new RequestMessageVerbMatcher("head")); + _requestMatchers.Add(new RequestMessageMethodMatcher("head")); return this; } @@ -187,7 +187,7 @@ namespace WireMock.RequestBuilders /// public IHeadersAndCookiesRequestBuilder UsingAnyVerb() { - var matchers = _requestMatchers.Where(m => m is RequestMessageVerbMatcher).ToList(); + var matchers = _requestMatchers.Where(m => m is RequestMessageMethodMatcher).ToList(); foreach (var matcher in matchers) { _requestMatchers.Remove(matcher); @@ -203,7 +203,7 @@ namespace WireMock.RequestBuilders /// The . public IHeadersAndCookiesRequestBuilder UsingVerb(params string[] verbs) { - _requestMatchers.Add(new RequestMessageVerbMatcher(verbs)); + _requestMatchers.Add(new RequestMessageMethodMatcher(verbs)); return this; } diff --git a/src/WireMock.Net/RequestMessage.cs b/src/WireMock.Net/RequestMessage.cs index e9117f59..b4f82ce7 100644 --- a/src/WireMock.Net/RequestMessage.cs +++ b/src/WireMock.Net/RequestMessage.cs @@ -17,15 +17,20 @@ namespace WireMock /// public string Url { get; private set; } + /// + /// Gets the DateTime. + /// + public DateTime DateTime { get; set; } + /// /// Gets the path. /// public string Path { get; } /// - /// Gets the verb. + /// Gets the method. /// - public string Verb { get; } + public string Method { get; } /// /// Gets the headers. @@ -68,7 +73,7 @@ namespace WireMock Url = url.ToString(); Path = url.AbsolutePath; - Verb = verb.ToLower(); + Method = verb.ToLower(); BodyAsBytes = bodyAsBytes; Body = body; Headers = headers; diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index 98b5d2b2..f63bcacc 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -185,7 +185,7 @@ namespace WireMock.ResponseBuilders ResponseMessage responseMessage; if (_useTransformer) { - responseMessage = new ResponseMessage { StatusCode = ResponseMessage.StatusCode }; + responseMessage = new ResponseMessage { StatusCode = ResponseMessage.StatusCode, BodyOriginal = ResponseMessage.Body }; var template = new { request = requestMessage }; diff --git a/src/WireMock.Net/ResponseMessage.cs b/src/WireMock.Net/ResponseMessage.cs index 150a48b0..ed9e8a56 100644 --- a/src/WireMock.Net/ResponseMessage.cs +++ b/src/WireMock.Net/ResponseMessage.cs @@ -17,6 +17,11 @@ namespace WireMock /// public int StatusCode { get; set; } = 200; + /// + /// Gets or sets the body. + /// + public string BodyOriginal { get; set; } + /// /// Gets or sets the body. /// diff --git a/src/WireMock.Net/Server/FluentMockServer.Admin.cs b/src/WireMock.Net/Server/FluentMockServer.Admin.cs index fd6e4615..5b2b7375 100644 --- a/src/WireMock.Net/Server/FluentMockServer.Admin.cs +++ b/src/WireMock.Net/Server/FluentMockServer.Admin.cs @@ -3,7 +3,8 @@ using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; using Newtonsoft.Json; -using WireMock.Admin; +using WireMock.Admin.Mappings; +using WireMock.Admin.Requests; using WireMock.Matchers; using WireMock.Matchers.Request; using WireMock.RequestBuilders; @@ -19,6 +20,42 @@ namespace WireMock.Server private void InitAdmin() { Given(Request.Create().WithUrl("/__admin/mappings").UsingGet()).RespondWith(new DynamicResponseProvider(MappingsGet)); + + Given(Request.Create().WithUrl("/__admin/requests").UsingGet()).RespondWith(new DynamicResponseProvider(RequestsGet)); + } + + private ResponseMessage RequestsGet() + { + var result = new List(); + foreach (var logEntry in LogEntries.Where(r => !r.RequestMessage.Path.StartsWith("/__admin/"))) + { + var model = new LogEntryModel + { + Request = new LogRequestModel + { + Guid = Guid.NewGuid(), + DateTime = logEntry.RequestMessage.DateTime, + Url = logEntry.RequestMessage.Path, + AbsoleteUrl = logEntry.RequestMessage.Url, + Query = logEntry.RequestMessage.Query, + Method = logEntry.RequestMessage.Method, + Body = logEntry.RequestMessage.Body, + Headers = logEntry.RequestMessage.Headers, + Cookies = logEntry.RequestMessage.Cookies + }, + Response = new LogResponseModel + { + StatusCode = logEntry.ResponseMessage.StatusCode, + Body = logEntry.ResponseMessage.Body, + BodyOriginal = logEntry.ResponseMessage.BodyOriginal, + Headers = logEntry.ResponseMessage.Headers + } + }; + + result.Add(model); + } + + return ToJson(result); } private ResponseMessage MappingsGet() @@ -32,7 +69,7 @@ namespace WireMock.Server var cookieMatchers = request.GetRequestMessageMatchers(); var paramsMatchers = request.GetRequestMessageMatchers(); var bodyMatcher = request.GetRequestMessageMatcher(); - var verbMatcher = request.GetRequestMessageMatcher(); + var methodMatcher = request.GetRequestMessageMatcher(); var response = (Response) mapping.Provider; @@ -45,7 +82,7 @@ namespace WireMock.Server { Matchers = urlMatchers != null ? Map(urlMatchers.Where(m => m.Matchers != null).SelectMany(m => m.Matchers)) : null }, - Verbs = verbMatcher != null ? verbMatcher.Verbs : new [] { "any" }, + Methods = methodMatcher != null ? methodMatcher.Methods : new [] { "any" }, Headers = headerMatchers?.Select(hm => new HeaderModel { Name = hm.Name, diff --git a/src/WireMock.Net/Server/FluentMockServer.cs b/src/WireMock.Net/Server/FluentMockServer.cs index 8ba597a7..a5e667a5 100644 --- a/src/WireMock.Net/Server/FluentMockServer.cs +++ b/src/WireMock.Net/Server/FluentMockServer.cs @@ -4,10 +4,10 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Net; -using System.Text; using System.Threading.Tasks; using JetBrains.Annotations; using WireMock.Http; +using WireMock.Logging; using WireMock.Matchers.Request; using WireMock.Validation; @@ -18,39 +18,18 @@ namespace WireMock.Server /// public partial class FluentMockServer { - /// - /// The _http server. - /// private readonly TinyHttpServer _httpServer; - /// - /// The _mappings. - /// private readonly IList _mappings = new List(); - /// - /// The _request logs. - /// - private readonly IList _requestLogs = new List(); + private readonly IList _logEntries = new List(); - /// - /// The _request mapper. - /// private readonly HttpListenerRequestMapper _requestMapper = new HttpListenerRequestMapper(); - /// - /// The _response mapper. - /// private readonly HttpListenerResponseMapper _responseMapper = new HttpListenerResponseMapper(); - /// - /// The _sync root. - /// private readonly object _syncRoot = new object(); - /// - /// The _request processing delay. - /// private TimeSpan _requestProcessingDelay = TimeSpan.Zero; /// @@ -61,19 +40,19 @@ namespace WireMock.Server /// /// Gets the request logs. /// - public IEnumerable RequestLogs + public IEnumerable LogEntries { get { - lock (((ICollection)_requestLogs).SyncRoot) + lock (((ICollection)_logEntries).SyncRoot) { - return new ReadOnlyCollection(_requestLogs); + return new ReadOnlyCollection(_logEntries); } } } /// - /// Gets the routes. + /// Gets the mappings. /// public IEnumerable Mappings { @@ -146,9 +125,9 @@ namespace WireMock.Server /// public void Reset() { - lock (((ICollection)_requestLogs).SyncRoot) + lock (((ICollection)_logEntries).SyncRoot) { - _requestLogs.Clear(); + _logEntries.Clear(); } lock (((ICollection)_mappings).SyncRoot) @@ -160,17 +139,13 @@ namespace WireMock.Server /// /// The search logs for. /// - /// - /// The matcher. - /// - /// - /// The . - /// - public IEnumerable SearchLogsFor(IRequestMatcher spec) + /// The matcher. + /// The . + public IEnumerable SearchLogsFor(IRequestMatcher matcher) { - lock (((ICollection)_requestLogs).SyncRoot) + lock (((ICollection)_logEntries).SyncRoot) { - return _requestLogs.Where(spec.IsMatch); + return _logEntries.Where(log => matcher.IsMatch(log.RequestMessage)); } } @@ -215,14 +190,12 @@ namespace WireMock.Server /// /// The log request. /// - /// - /// The request. - /// - private void LogRequest(RequestMessage requestMessage) + /// The request. + private void LogRequest(LogEntry entry) { - lock (((ICollection)_requestLogs).SyncRoot) + lock (((ICollection)_logEntries).SyncRoot) { - _requestLogs.Add(requestMessage); + _logEntries.Add(entry); } } @@ -238,33 +211,44 @@ namespace WireMock.Server } var request = _requestMapper.Map(ctx.Request); - LogRequest(request); + + ResponseMessage response = null; try { var targetRoute = _mappings.FirstOrDefault(route => route.IsRequestHandled(request)); if (targetRoute == null) { - ctx.Response.StatusCode = 404; - - byte[] content = Encoding.UTF8.GetBytes("No mapping found"); - ctx.Response.OutputStream.Write(content, 0, content.Length); + response = new ResponseMessage + { + StatusCode = 404, + Body = "No mapping found" + }; } else { - var response = await targetRoute.ResponseTo(request); - _responseMapper.Map(response, ctx.Response); + response = await targetRoute.ResponseTo(request); } } catch (Exception ex) { - ctx.Response.StatusCode = 500; - - byte[] content = Encoding.UTF8.GetBytes(ex.ToString()); - ctx.Response.OutputStream.Write(content, 0, content.Length); + response = new ResponseMessage + { + StatusCode = 500, + Body = ex.ToString() + }; } finally { + var log = new LogEntry + { + RequestMessage = request, + ResponseMessage = response + }; + + LogRequest(log); + + _responseMapper.Map(response, ctx.Response); ctx.Response.Close(); } } diff --git a/test/WireMock.Net.Tests/FluentMockServerTests.cs b/test/WireMock.Net.Tests/FluentMockServerTests.cs index b27786d8..aa54eaf5 100644 --- a/test/WireMock.Net.Tests/FluentMockServerTests.cs +++ b/test/WireMock.Net.Tests/FluentMockServerTests.cs @@ -97,10 +97,10 @@ namespace WireMock.Net.Tests await new HttpClient().GetAsync("http://localhost:" + _server.Port + "/foo"); // then - Check.That(_server.RequestLogs).HasSize(1); - var requestLogged = _server.RequestLogs.First(); - Check.That(requestLogged.Verb).IsEqualTo("get"); - Check.That(requestLogged.BodyAsBytes).IsNull(); + Check.That(_server.LogEntries).HasSize(1); + var requestLogged = _server.LogEntries.First(); + Check.That(requestLogged.RequestMessage.Method).IsEqualTo("get"); + Check.That(requestLogged.RequestMessage.BodyAsBytes).IsNull(); } [Test] @@ -118,8 +118,8 @@ namespace WireMock.Net.Tests Check.That(result).HasSize(1); var requestLogged = result.First(); - Check.That(requestLogged.Path).IsEqualTo("/bar"); - Check.That(requestLogged.Url).IsEqualTo("http://localhost:" + _server.Port + "/bar"); + Check.That(requestLogged.RequestMessage.Path).IsEqualTo("/bar"); + Check.That(requestLogged.RequestMessage.Url).IsEqualTo("http://localhost:" + _server.Port + "/bar"); } [Test] @@ -133,7 +133,7 @@ namespace WireMock.Net.Tests _server.Reset(); // then - Check.That(_server.RequestLogs).IsEmpty(); + Check.That(_server.LogEntries).IsEmpty(); } [Test] diff --git a/test/WireMock.Net.Tests/HttpListenerRequestMapperTests.cs b/test/WireMock.Net.Tests/HttpListenerRequestMapperTests.cs index 14e078af..6fb4923a 100644 --- a/test/WireMock.Net.Tests/HttpListenerRequestMapperTests.cs +++ b/test/WireMock.Net.Tests/HttpListenerRequestMapperTests.cs @@ -46,7 +46,7 @@ namespace WireMock.Net.Tests // then Check.That(MapperServer.LastRequestMessage).IsNotNull(); - Check.That(MapperServer.LastRequestMessage.Verb).IsEqualTo("put"); + Check.That(MapperServer.LastRequestMessage.Method).IsEqualTo("put"); } [Test] diff --git a/test/WireMock.Net.Tests/ResponseTests.cs b/test/WireMock.Net.Tests/ResponseTests.cs index 017ec565..663c6ed9 100644 --- a/test/WireMock.Net.Tests/ResponseTests.cs +++ b/test/WireMock.Net.Tests/ResponseTests.cs @@ -20,7 +20,7 @@ namespace WireMock.Net.Tests var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", body, bodyAsString); var response = Response.Create() - .WithBody("test {{request.url}} {{request.path}} {{request.verb}}") + .WithBody("test {{request.url}} {{request.path}} {{request.method}}") .WithTransformer(); // act