public async Task Invoke(HttpContext context, IEnumerable <IHttpServerEventCallback> callbacks)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (callbacks == null)
            {
                throw new ArgumentNullException(nameof(callbacks));
            }

            var stopwatch = Stopwatch.StartNew();

            callbacks.Invoke(() => HttpServerRequest.Create(context));

            try
            {
                await _next(context);
            }
            catch (HttpException e)
            {
                await WriteResponse(context, e.StatusCode, e.Message);
            }
            catch (Exception e)
            {
                await WriteResponse(context, HttpStatusCode.InternalServerError, "FAIL!");

                callbacks.Invoke(() => HttpServerException.Create(context, stopwatch.ElapsedMilliseconds, e));
            }

            callbacks.Invoke(() => HttpServerResponse.Create(context, stopwatch.ElapsedMilliseconds));
        }
        public void logs_one_item()
        {
            var httpServerRequest = HttpServerRequest.Create(_httpContext);

            _testSubject.Invoke(httpServerRequest);

            _logger.Logs.Count.ShouldBe(1);
        }
        public void serialise_server_request()
        {
            var httpServerRequest = HttpServerRequest.Create(_httpContext);

            httpServerRequest.Timestamp = new DateTimeOffset(2016, 11, 18, 19, 52, 6, TimeSpan.Zero).AddTicks(4425454);

            _testSubject.Invoke(httpServerRequest);

            _logger.Logs[0].ShouldBe("{\"eventType\":\"HttpServerRequest\",\"timestamp\":\"2016-11-18T19:52:06.4425454+00:00\",\"uri\":\"/ping?v=1\",\"method\":\"GET\",\"userAgent\":\"my-user-agent\"}");
        }