Exemple #1
0
        public virtual async Task InvokeAsyncBase(HttpContext context, AutoWrapperMembers awm)
        {
            if (awm.IsSwagger(context) || !awm.IsApi(context))
            {
                await _next(context);
            }
            else
            {
                var stopWatch = Stopwatch.StartNew();
                var request   = await awm.FormatRequestAsync(context.Request);

                var originalResponseBodyStream = context.Response.Body;

                using var memoryStream = new MemoryStream();

                try
                {
                    context.Response.Body = memoryStream;
                    await _next.Invoke(context);

                    if (context.Response.HasStarted)
                    {
                        LogResponseHasStartedError(); return;
                    }

                    var bodyAsText = await awm.ReadResponseBodyStreamAsync(memoryStream);

                    context.Response.Body = originalResponseBodyStream;

                    var actionIgnore = context.Response.Headers[TypeIdentifier.AutoWrapIgnoreFilterHeader];
                    if (actionIgnore.Count > 0)
                    {
                        await awm.WrapIgnoreAsync(context, bodyAsText); return;
                    }

                    if (context.Response.StatusCode != Status304NotModified || context.Response.StatusCode != Status204NoContent)
                    {
                        if (!_options.IsApiOnly &&
                            (bodyAsText.IsHtml() &&
                             !_options.BypassHTMLValidation) &&
                            context.Response.StatusCode == Status200OK)
                        {
                            context.Response.StatusCode = Status404NotFound;
                        }

                        if (!context.Request.Path.StartsWithSegments(new PathString(_options.WrapWhenApiPathStartsWith)) &&
                            bodyAsText.IsHtml() &&
                            context.Response.StatusCode == Status200OK)
                        {
                            if (memoryStream.Length > 0)
                            {
                                await awm.HandleNotApiRequestAsync(context);
                            }
                            return;
                        }

                        if (awm.IsRequestSuccessful(context.Response.StatusCode))
                        {
                            await awm.HandleSuccessfulRequestAsync(context, bodyAsText, context.Response.StatusCode);
                        }
                        else
                        {
                            if (_options.UseApiProblemDetailsException)
                            {
                                await awm.HandleProblemDetailsExceptionAsync(context, _executor, bodyAsText); return;
                            }

                            await awm.HandleUnsuccessfulRequestAsync(context, bodyAsText, context.Response.StatusCode);
                        }
                    }
                }
                catch (Exception exception)
                {
                    if (context.Response.HasStarted)
                    {
                        LogResponseHasStartedError(); return;
                    }

                    if (_options.UseApiProblemDetailsException)
                    {
                        await awm.HandleProblemDetailsExceptionAsync(context, _executor, null, exception);
                    }
                    else
                    {
                        await awm.HandleExceptionAsync(context, exception);
                    }
                    await awm.RevertResponseBodyStreamAsync(memoryStream, originalResponseBodyStream);
                }
                finally
                {
                    LogResponse(context, request, stopWatch);
                }
            }
        }