using Ocelot.Infrastructure.Extensions; using Ocelot.Logging; using Ocelot.Middleware; using Ocelot.Responder; using System.IO; using System.Security.Policy; using System.Text; namespace ApiGateway.Middleware { public class OcelotResponseMiddleware : OcelotMiddleware { private readonly RequestDelegate _next; private readonly IHttpResponder _responder; private readonly IErrorsToHttpStatusCodeMapper _codeMapper; public OcelotResponseMiddleware( RequestDelegate next, IHttpResponder responder, IErrorsToHttpStatusCodeMapper codeMapper, IOcelotLoggerFactory loggerFactory) : base(loggerFactory.CreateLogger()) { _next = next; _responder = responder; _codeMapper = codeMapper; } public async Task Invoke(HttpContext httpContext) { var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole().AddEventLog()); var logger = loggerFactory.CreateLogger("ResMiddleware"); string date = DateTime.Now.ToString(); var sb = new StringBuilder() .Append("Ingreso ResMiddleware: ").AppendLine(date); await _next.Invoke(httpContext); if (httpContext.Response.HasStarted) { sb.Append("Ingresa al if y return"); logger.LogInformation(69, sb.ToString()); return; } var errors = httpContext.Items.Errors(); if (errors.Count > 0) { //Logger.LogWarning($"{errors.ToErrorString()} errors found in {MiddlewareName}. Setting error response for request path:{httpContext.Request.Path}, request method: {httpContext.Request.Method}"); sb.Append("Hay errores res middleware"); sb.Append("Cant errores: " + errors.Count.ToString()); sb.Append(errors.ToErrorString()); logger.LogError(71, sb.ToString()); var statusCode = _codeMapper.Map(errors); var error = string.Join(",", errors.Select(x => x.Message)); httpContext.Response.StatusCode = statusCode; // output error await httpContext.Response.WriteAsync(error); } else { //Logger.LogDebug("no pipeline errors, setting and returning completed response"); sb.Append("no pipeline errors, setting and returning completed response"); logger.LogInformation(69, sb.ToString()); var downstreamResponse = httpContext.Items.DownstreamResponse(); await _responder.SetResponseOnHttpContext(httpContext, downstreamResponse); } } } }