Exemplo n.º 1
0
        private async Task UpdateLogs(HttpContext context, ObjectId teamId, IReadOnlyCollection <ObjectId> stubIds,
                                      Response response, CancellationToken cancellationToken)
        {
            var    requestStream = context.Request.Body;
            string requestBody;

            using (var streamReader = new StreamReader(requestStream))
            {
                requestBody = streamReader.ReadToEnd();
            }

            var command = new CreateTeamLogCommand
                          (
                teamId,
                stubIds,
                new Commands.CreateTeamLog.Version1.Request
                (
                    context.Request.Method,
                    context.Request.Path,
                    context.Request.Query.Select(q => new QueryStringParameter(q.Key, q.Value)).ToList(),
                    requestBody,
                    context.Request.Headers.Select(h => new Header(h.Key, h.Value)).ToList()
                ),
                response
                          );

            await _commandDispatcher.DispatchAsync(command, cancellationToken);
        }
Exemplo n.º 2
0
        private async Task NotFound(HttpContext context, ObjectId teamId, CancellationToken cancellationToken)
        {
            var response = new
            {
                Code    = "NoMatchingStubs",
                Message = "No stubs were found for this request."
            };

            var responseJson =
                JsonConvert.SerializeObject(response, Formatting.Indented, JsonConstants.JsonSerializerSettings);

            var response404 = new Response
                              (
                404,
                responseJson,
                null
                              );

            context.Response.ContentType = "application/json";
            context.Response.StatusCode  = response404.HttpStatusCode;
            await context.Response.WriteAsync(responseJson, cancellationToken);

            await UpdateLogs(context, teamId, null, response404, cancellationToken);
        }
Exemplo n.º 3
0
        public async Task Invoke(HttpContext context)
        {
            var cancellationToken = context?.RequestAborted ?? default(CancellationToken);
            var teamId            = ParseTeamId(context.Request);

            if (teamId == null)
            {
                await _next(context);

                return;
            }

            var    requestStream = context.Request.Body;
            string requestBody;

            using (var streamReader = new StreamReader(requestStream))
            {
                requestBody = streamReader.ReadToEnd();
            }

            var query = new MatchStubsQuery
                        (
                teamId.Value,
                new Request
                (
                    context.Request.Method,
                    context.Request.Path,
                    context.Request.Query,
                    context.Request.Headers,
                    requestBody
                )
                        );

            var projection = await _queryDispatcher.DispatchAsync(query, cancellationToken);

            if (projection == null || !projection.Stubs.Any())
            {
                await NotFound(context, teamId.Value, cancellationToken);

                return;
            }

            if (projection.Stubs.Count > 1)
            {
                var response = new
                {
                    ErrorCode    = "MultipleMatchingStubs",
                    ErrorMessage = $"{projection.Stubs.Count} stubs were found for this request.",
                    Stubs        = projection.Stubs.Select(x => new
                    {
                        x.StubId
                    })
                };

                var responseJson = JsonConvert.SerializeObject(response, Formatting.Indented,
                                                               JsonConstants.JsonSerializerSettings);

                var response500 = new Response
                                  (
                    500,
                    responseJson,
                    null
                                  );

                context.Response.ContentType = "application/json";
                context.Response.StatusCode  = response500.HttpStatusCode;
                await context.Response.WriteAsync(responseJson, cancellationToken);

                await UpdateLogs(context, teamId.Value, null, response500, cancellationToken);

                return;
            }

            var stub = projection.Stubs.SingleOrDefault();

            if (stub == null)
            {
                await NotFound(context, teamId.Value, cancellationToken);

                return;
            }

            context.Response.StatusCode = stub.Response.HttpStatusCode;

            if (stub.Response.Headers != null)
            {
                foreach (var responseHeader in stub.Response.Headers)
                {
                    context.Response.Headers.Add(responseHeader.Key, responseHeader.Value);
                }
            }

            if (!string.IsNullOrWhiteSpace(stub.Response.Body))
            {
                await context.Response.WriteAsync(stub.Response.Body, cancellationToken);
            }

            var stubResponse = new Response
                               (
                stub.Response.HttpStatusCode,
                stub.Response.Body,
                stub.Response.Headers?.Select(h => new Header(h.Key, h.Value)).ToList()
                               );

            await UpdateLogs(context, teamId.Value, new[] { ObjectId.Parse(stub.StubId) }, stubResponse,
                             cancellationToken);
        }