2022-11-02 11:31:23 -05:00
using Ocelot.Infrastructure.Extensions ;
using Ocelot.Logging ;
using Ocelot.Middleware ;
using Ocelot.Responder ;
2023-01-10 10:35:15 -05:00
using System.IO ;
using System.Security.Policy ;
using System.Text ;
2022-11-02 11:31:23 -05:00
2022-11-02 12:06:54 -05:00
namespace ApiGateway.Middleware
2022-11-02 11:31:23 -05:00
{
2022-11-02 12:06:54 -05:00
public class OcelotResponseMiddleware : OcelotMiddleware
2022-11-02 11:31:23 -05:00
{
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 < OcelotResponseMiddleware > ( ) )
{
_next = next ;
_responder = responder ;
_codeMapper = codeMapper ;
}
public async Task Invoke ( HttpContext httpContext )
{
2023-01-10 10:35:15 -05:00
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 ) ;
2022-11-02 11:31:23 -05:00
await _next . Invoke ( httpContext ) ;
if ( httpContext . Response . HasStarted )
2023-01-10 10:35:15 -05:00
{
sb . Append ( "Ingresa al if y return" ) ;
logger . LogInformation ( 69 , sb . ToString ( ) ) ;
2022-11-02 11:31:23 -05:00
return ;
2023-01-10 10:35:15 -05:00
}
2022-11-02 11:31:23 -05:00
var errors = httpContext . Items . Errors ( ) ;
if ( errors . Count > 0 )
{
2023-01-10 10:35:15 -05:00
//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 ( ) ) ;
2022-11-02 11:31:23 -05:00
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
{
2023-01-10 10:35:15 -05:00
//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 ( ) ) ;
2022-11-02 11:31:23 -05:00
var downstreamResponse = httpContext . Items . DownstreamResponse ( ) ;
await _responder . SetResponseOnHttpContext ( httpContext , downstreamResponse ) ;
}
}
}
}