public virtual async Task InvokeAsyncBase(HttpContext context, AutoWrapperMembers awm) { if (awm.IsSwagger(context) || !awm.IsApi(context)) { await this._next(context); } else { var stopWatch = Stopwatch.StartNew(); var request = await awm.FormatRequest(context.Request); var originalBodyStream = context.Response.Body; using (var newBodyStream = new MemoryStream()) { try { context.Response.Body = newBodyStream; await _next.Invoke(context); context.Response.Body = originalBodyStream; var bodyAsText = await awm.FormatResponse(newBodyStream); var actionIgnore = context.Response.Headers["AutoWrapIgnoreFilter"]; if (actionIgnore.Count > 0) { await awm.WrapIgnoreAsync(context, bodyAsText); return; } if (context.Response.StatusCode != Status304NotModified) { if (!_options.IsApiOnly && bodyAsText.IsHtml() && context.Response.StatusCode == Status200OK) { context.Response.StatusCode = Status404NotFound; } if (!context.Request.Path.StartsWithSegments(new PathString(_options.WrapWhenApiPathStartsWith)) && bodyAsText.IsHtml() && context.Response.StatusCode == Status200OK) { if (newBodyStream.Length > 0) { await awm.HandleSpaSupportAsync(context); return; } } else if (context.Response.StatusCode == Status200OK) { await awm.HandleSuccessRequestAsync(context, bodyAsText, context.Response.StatusCode); } else { await awm.HandleNotSuccessRequestAsync(context, bodyAsText, context.Response.StatusCode); } } } catch (Exception ex) { await awm.HandleExceptionAsync(context, ex); newBodyStream.Seek(0, SeekOrigin.Begin); await newBodyStream.CopyToAsync(originalBodyStream); } finally { stopWatch.Stop(); if (_options.EnableResponseLogging) { _logger.Log(LogLevel.Information, $@"Source:[{context.Connection.RemoteIpAddress.ToString() }] Request: {request} Responded with [{context.Response.StatusCode}] in {stopWatch.ElapsedMilliseconds}ms"); } } } } }
public virtual async Task InvokeAsyncBase(HttpContext context, AutoWrapperMembers awm) { if (awm.IsSwagger(context) || !awm.IsApi(context)) { await this._next(context); } else { var stopWatch = Stopwatch.StartNew(); var request = await awm.FormatRequest(context.Request); var originalBodyStream = context.Response.Body; using (var newBodyStream = new MemoryStream()) { try { context.Response.Body = newBodyStream; await _next.Invoke(context); context.Response.Body = originalBodyStream; var bodyAsText = await awm.FormatResponse(newBodyStream); var actionIgnore = context.Response.Headers["AutoWrapIgnoreFilter"]; if (actionIgnore.Count > 0) { await awm.WrapIgnoreAsync(context, bodyAsText); return; } if (context.Response.StatusCode != Status304NotModified) { 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 (newBodyStream.Length > 0) { await awm.HandleSpaSupportAsync(context); return; } } else if (context.Response.StatusCode == Status200OK) { await awm.HandleSuccessRequestAsync(context, bodyAsText, context.Response.StatusCode); } else { await awm.HandleNotSuccessRequestAsync(context, bodyAsText, context.Response.StatusCode); } } } catch (Exception ex) { await awm.HandleExceptionAsync(context, ex); newBodyStream.Seek(0, SeekOrigin.Begin); await newBodyStream.CopyToAsync(originalBodyStream); } finally { LogResponse(context, request, stopWatch); } } } }
public virtual async Task InvokeAsyncBase(HttpContext context, AutoWrapperMembers awm) { if (awm.IsSwagger(context) || !awm.IsApi(context)) { await this._next(context); } else { var stopWatch = Stopwatch.StartNew(); var request = await awm.FormatRequest(context.Request); var originalBodyStream = context.Response.Body; using (var newBodyStream = new MemoryStream()) { try { context.Response.Body = newBodyStream; await _next.Invoke(context); context.Response.Body = originalBodyStream; var bodyAsText = await awm.FormatResponse(newBodyStream); if (context.Response.StatusCode != 304) { if (!_options.IsApiOnly && bodyAsText.IsHtml() && context.Response.StatusCode == 200) { context.Response.StatusCode = 404; } if (!context.Request.Path.StartsWithSegments(new PathString(_options.WrapWhenApiPathStartsWith)) && bodyAsText.IsHtml() && context.Response.StatusCode == 200) { if (newBodyStream.Length > 0) { await awm.HandleSpaSupportAsync(context); return; } } else if (context.Response.StatusCode == 200) { await awm.HandleSuccessRequestAsync(context, bodyAsText, context.Response.StatusCode); } else { await awm.HandleNotSuccessRequestAsync(context, context.Response.StatusCode); } } } catch (Exception ex) { await awm.HandleExceptionAsync(context, ex); newBodyStream.Seek(0, SeekOrigin.Begin); await newBodyStream.CopyToAsync(originalBodyStream); } finally { stopWatch.Stop(); _logger.Log(LogLevel.Information, $@"Request: {request} Responded with [{context.Response.StatusCode}] in {stopWatch.ElapsedMilliseconds}ms"); } } } }