mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	more logging, more readme, more refactoring
This commit is contained in:
		@@ -1,16 +1,14 @@
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.Authentication.Handler
 | 
			
		||||
namespace Ocelot.Authentication.Handler
 | 
			
		||||
{
 | 
			
		||||
    public class AuthenticationHandler
 | 
			
		||||
    {
 | 
			
		||||
        public AuthenticationHandler(string provider, RequestDelegate handler)
 | 
			
		||||
        public AuthenticationHandler(string provider, IHandler handler)
 | 
			
		||||
        {
 | 
			
		||||
            Provider = provider;
 | 
			
		||||
            Handler = handler;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public string Provider { get; private set; }
 | 
			
		||||
        public RequestDelegate Handler { get; private set; }
 | 
			
		||||
        public IHandler Handler { get; private set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -23,7 +23,8 @@ namespace Ocelot.Authentication.Handler.Factory
 | 
			
		||||
 | 
			
		||||
            if (!handler.IsError)
 | 
			
		||||
            {
 | 
			
		||||
                return new OkResponse<AuthenticationHandler>(new AuthenticationHandler(authOptions.Provider, handler.Data));
 | 
			
		||||
                return new OkResponse<AuthenticationHandler>(
 | 
			
		||||
                    new AuthenticationHandler(authOptions.Provider, new RequestDelegateHandler(handler.Data)));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return new ErrorResponse<AuthenticationHandler>(new List<Error>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								src/Ocelot/Authentication/Handler/IHandler.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/Ocelot/Authentication/Handler/IHandler.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.Authentication.Handler
 | 
			
		||||
{
 | 
			
		||||
    public interface IHandler
 | 
			
		||||
    {
 | 
			
		||||
        Task Handle(HttpContext context);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								src/Ocelot/Authentication/Handler/RequestDelegateHandler.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/Ocelot/Authentication/Handler/RequestDelegateHandler.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.Authentication.Handler
 | 
			
		||||
{
 | 
			
		||||
    public class RequestDelegateHandler : IHandler
 | 
			
		||||
    {
 | 
			
		||||
        private readonly RequestDelegate _requestDelegate;
 | 
			
		||||
 | 
			
		||||
        public RequestDelegateHandler(RequestDelegate requestDelegate)
 | 
			
		||||
        {
 | 
			
		||||
            _requestDelegate = requestDelegate;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task Handle(HttpContext context)
 | 
			
		||||
        {
 | 
			
		||||
            await _requestDelegate.Invoke(context);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -44,7 +44,7 @@ namespace Ocelot.Authentication.Middleware
 | 
			
		||||
                {
 | 
			
		||||
                    _logger.LogDebug("calling authentication handler for ReRoute");
 | 
			
		||||
 | 
			
		||||
                    await authenticationHandler.Data.Handler.Invoke(context);
 | 
			
		||||
                    await authenticationHandler.Data.Handler.Handle(context);
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ namespace Ocelot.Cache.Middleware
 | 
			
		||||
 | 
			
		||||
            _logger.LogDebug("succesfully called next middleware");
 | 
			
		||||
 | 
			
		||||
            if (PipelineError())
 | 
			
		||||
            if (PipelineError)
 | 
			
		||||
            {
 | 
			
		||||
                _logger.LogDebug("there was a pipeline error for {downstreamUrlKey}", downstreamUrlKey);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Ocelot.Infrastructure.RequestData;
 | 
			
		||||
using Ocelot.Logging;
 | 
			
		||||
using Ocelot.Middleware;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Ocelot.DownstreamRouteFinder.Finder;
 | 
			
		||||
using Ocelot.Infrastructure.RequestData;
 | 
			
		||||
using Ocelot.Logging;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Ocelot.DownstreamRouteFinder;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Ocelot.DownstreamUrlCreator.UrlTemplateReplacer;
 | 
			
		||||
using Ocelot.Infrastructure.RequestData;
 | 
			
		||||
using Ocelot.Logging;
 | 
			
		||||
 
 | 
			
		||||
@@ -25,10 +25,10 @@ namespace Ocelot.Errors.Middleware
 | 
			
		||||
        public async Task Invoke(HttpContext context)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {   
 | 
			
		||||
                _logger.LogDebug("calling middleware");
 | 
			
		||||
            {
 | 
			
		||||
                _logger.LogDebug("ocelot pipeline started");
 | 
			
		||||
 | 
			
		||||
                _requestScopedDataRepository.Add("RequestId", context.TraceIdentifier);
 | 
			
		||||
                _logger.LogDebug("calling next middleware");
 | 
			
		||||
 | 
			
		||||
                await _next.Invoke(context);
 | 
			
		||||
 | 
			
		||||
@@ -42,6 +42,8 @@ namespace Ocelot.Errors.Middleware
 | 
			
		||||
                _logger.LogError(message, e);
 | 
			
		||||
                await SetInternalServerErrorOnResponse(context);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            _logger.LogDebug("ocelot pipeline finished");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static async Task SetInternalServerErrorOnResponse(HttpContext context)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,9 @@
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Ocelot.Infrastructure.RequestData;
 | 
			
		||||
using Ocelot.Logging;
 | 
			
		||||
using Ocelot.Middleware;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.Headers.Middleware
 | 
			
		||||
@@ -10,24 +12,45 @@ namespace Ocelot.Headers.Middleware
 | 
			
		||||
    {
 | 
			
		||||
        private readonly RequestDelegate _next;
 | 
			
		||||
        private readonly IAddHeadersToRequest _addHeadersToRequest;
 | 
			
		||||
        private readonly IOcelotLogger _logger;
 | 
			
		||||
 | 
			
		||||
        public HttpRequestHeadersBuilderMiddleware(RequestDelegate next, 
 | 
			
		||||
        public HttpRequestHeadersBuilderMiddleware(RequestDelegate next,
 | 
			
		||||
            IOcelotLoggerFactory loggerFactory,
 | 
			
		||||
            IRequestScopedDataRepository requestScopedDataRepository,
 | 
			
		||||
            IAddHeadersToRequest addHeadersToRequest) 
 | 
			
		||||
            : base(requestScopedDataRepository)
 | 
			
		||||
        {
 | 
			
		||||
            _next = next;
 | 
			
		||||
            _addHeadersToRequest = addHeadersToRequest;
 | 
			
		||||
            _logger = loggerFactory.CreateLogger<HttpRequestHeadersBuilderMiddleware>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task Invoke(HttpContext context)
 | 
			
		||||
        {
 | 
			
		||||
            _logger.LogDebug("started calling headers builder middleware");
 | 
			
		||||
 | 
			
		||||
            if (DownstreamRoute.ReRoute.ClaimsToHeaders.Any())
 | 
			
		||||
            {
 | 
			
		||||
                _addHeadersToRequest.SetHeadersOnContext(DownstreamRoute.ReRoute.ClaimsToHeaders, context);
 | 
			
		||||
                _logger.LogDebug("this route has instructions to convert claims to headers");
 | 
			
		||||
 | 
			
		||||
                var response = _addHeadersToRequest.SetHeadersOnContext(DownstreamRoute.ReRoute.ClaimsToHeaders, context);
 | 
			
		||||
 | 
			
		||||
                if (response.IsError)
 | 
			
		||||
                {
 | 
			
		||||
                    _logger.LogDebug("there was an error setting headers on context, setting pipeline error");
 | 
			
		||||
 | 
			
		||||
                    SetPipelineError(response.Errors);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                _logger.LogDebug("headers have been set on context");
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            _logger.LogDebug("calling next middleware");
 | 
			
		||||
 | 
			
		||||
            await _next.Invoke(context);
 | 
			
		||||
 | 
			
		||||
            _logger.LogDebug("succesfully called next middleware");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -46,21 +46,24 @@ namespace Ocelot.Logging
 | 
			
		||||
 | 
			
		||||
        public void LogDebug(string message, params object[] args)
 | 
			
		||||
        {
 | 
			
		||||
            _logger.LogDebug(GetMessageWithRequestId(message), args);
 | 
			
		||||
            _logger.LogDebug(GetMessageWithOcelotRequestId(message), args);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void LogError(string message, Exception exception)
 | 
			
		||||
        {
 | 
			
		||||
            _logger.LogError(GetMessageWithRequestId(message), exception);
 | 
			
		||||
            _logger.LogError(GetMessageWithOcelotRequestId(message), exception);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private string GetMessageWithRequestId(string message)
 | 
			
		||||
        private string GetMessageWithOcelotRequestId(string message)
 | 
			
		||||
        {
 | 
			
		||||
            var requestId = _scopedDataRepository.Get<string>("RequestId");
 | 
			
		||||
 | 
			
		||||
            return requestId.IsError 
 | 
			
		||||
                ? $"{message} : RequestId: Error" 
 | 
			
		||||
                : $"{message} : RequestId: {requestId.Data}";
 | 
			
		||||
            if (requestId != null && !requestId.IsError)
 | 
			
		||||
            {
 | 
			
		||||
                return $"{message} : OcelotRequestId - {requestId.Data}";
 | 
			
		||||
                
 | 
			
		||||
            }
 | 
			
		||||
            return $"{message} : OcelotRequestId - not set";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -15,22 +15,22 @@ namespace Ocelot.Middleware
 | 
			
		||||
            _requestScopedDataRepository = requestScopedDataRepository;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void SetPipelineError(List<Error> errors)
 | 
			
		||||
        public bool PipelineError
 | 
			
		||||
        {
 | 
			
		||||
            _requestScopedDataRepository.Add("OcelotMiddlewareError", true);
 | 
			
		||||
            _requestScopedDataRepository.Add("OcelotMiddlewareErrors", errors);
 | 
			
		||||
            get
 | 
			
		||||
            {
 | 
			
		||||
                var response = _requestScopedDataRepository.Get<bool>("OcelotMiddlewareError");
 | 
			
		||||
                return response.Data;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool PipelineError()
 | 
			
		||||
        public List<Error> PipelineErrors
 | 
			
		||||
        {
 | 
			
		||||
            var response = _requestScopedDataRepository.Get<bool>("OcelotMiddlewareError");
 | 
			
		||||
            return response.Data;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public List<Error> GetPipelineErrors()
 | 
			
		||||
        {
 | 
			
		||||
            var response = _requestScopedDataRepository.Get<List<Error>>("OcelotMiddlewareErrors");
 | 
			
		||||
            return response.Data;
 | 
			
		||||
            get
 | 
			
		||||
            {
 | 
			
		||||
                var response = _requestScopedDataRepository.Get<List<Error>>("OcelotMiddlewareErrors");
 | 
			
		||||
                return response.Data;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public DownstreamRoute DownstreamRoute
 | 
			
		||||
@@ -87,7 +87,12 @@ namespace Ocelot.Middleware
 | 
			
		||||
        public void SetHttpResponseMessageThisRequest(HttpResponseMessage responseMessage)
 | 
			
		||||
        {
 | 
			
		||||
            _requestScopedDataRepository.Add("HttpResponseMessage", responseMessage);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void SetPipelineError(List<Error> errors)
 | 
			
		||||
        {
 | 
			
		||||
            _requestScopedDataRepository.Add("OcelotMiddlewareError", true);
 | 
			
		||||
            _requestScopedDataRepository.Add("OcelotMiddlewareErrors", errors);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,7 @@ namespace Ocelot.Middleware
 | 
			
		||||
            builder.UseIfNotNull(middlewareConfiguration.PreErrorResponderMiddleware);
 | 
			
		||||
 | 
			
		||||
            // This is registered first so it can catch any errors and issue an appropriate response
 | 
			
		||||
            builder.UseHttpErrorResponderMiddleware();
 | 
			
		||||
            builder.UseResponderMiddleware();
 | 
			
		||||
 | 
			
		||||
            // Then we get the downstream route information
 | 
			
		||||
            builder.UseDownstreamRouteFinderMiddleware();
 | 
			
		||||
@@ -108,7 +108,7 @@ namespace Ocelot.Middleware
 | 
			
		||||
            // Everything should now be ready to build or HttpRequest
 | 
			
		||||
            builder.UseHttpRequestBuilderMiddleware();
 | 
			
		||||
 | 
			
		||||
            //We fire off the request and set the response on the context in this middleware
 | 
			
		||||
            //We fire off the request and set the response on the scoped data repo
 | 
			
		||||
            builder.UseHttpRequesterMiddleware();
 | 
			
		||||
 | 
			
		||||
            return builder;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,9 @@
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Ocelot.Infrastructure.RequestData;
 | 
			
		||||
using Ocelot.Logging;
 | 
			
		||||
using Ocelot.Middleware;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.QueryStrings.Middleware
 | 
			
		||||
@@ -10,24 +12,43 @@ namespace Ocelot.QueryStrings.Middleware
 | 
			
		||||
    {
 | 
			
		||||
        private readonly RequestDelegate _next;
 | 
			
		||||
        private readonly IAddQueriesToRequest _addQueriesToRequest;
 | 
			
		||||
        private readonly IOcelotLogger _logger;
 | 
			
		||||
 | 
			
		||||
        public QueryStringBuilderMiddleware(RequestDelegate next, 
 | 
			
		||||
        public QueryStringBuilderMiddleware(RequestDelegate next,
 | 
			
		||||
            IOcelotLoggerFactory loggerFactory,
 | 
			
		||||
            IRequestScopedDataRepository requestScopedDataRepository,
 | 
			
		||||
            IAddQueriesToRequest addQueriesToRequest) 
 | 
			
		||||
            : base(requestScopedDataRepository)
 | 
			
		||||
        {
 | 
			
		||||
            _next = next;
 | 
			
		||||
            _addQueriesToRequest = addQueriesToRequest;
 | 
			
		||||
            _logger = loggerFactory.CreateLogger<QueryStringBuilderMiddleware>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task Invoke(HttpContext context)
 | 
			
		||||
        {
 | 
			
		||||
            _logger.LogDebug("started calling query string builder middleware");
 | 
			
		||||
 | 
			
		||||
            if (DownstreamRoute.ReRoute.ClaimsToQueries.Any())
 | 
			
		||||
            {
 | 
			
		||||
                _addQueriesToRequest.SetQueriesOnContext(DownstreamRoute.ReRoute.ClaimsToQueries, context);
 | 
			
		||||
                _logger.LogDebug("this route has instructions to convert claims to queries");
 | 
			
		||||
 | 
			
		||||
                var response = _addQueriesToRequest.SetQueriesOnContext(DownstreamRoute.ReRoute.ClaimsToQueries, context);
 | 
			
		||||
 | 
			
		||||
                if (response.IsError)
 | 
			
		||||
                {
 | 
			
		||||
                    _logger.LogDebug("there was an error setting queries on context, setting pipeline error");
 | 
			
		||||
 | 
			
		||||
                    SetPipelineError(response.Errors);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            _logger.LogDebug("calling next middleware");
 | 
			
		||||
 | 
			
		||||
            await _next.Invoke(context);
 | 
			
		||||
 | 
			
		||||
            _logger.LogDebug("succesfully called next middleware");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,8 @@
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Ocelot.Infrastructure.RequestData;
 | 
			
		||||
using Ocelot.Logging;
 | 
			
		||||
using Ocelot.Middleware;
 | 
			
		||||
using Ocelot.Request.Builder;
 | 
			
		||||
 | 
			
		||||
@@ -10,18 +12,23 @@ namespace Ocelot.Request.Middleware
 | 
			
		||||
    {
 | 
			
		||||
        private readonly RequestDelegate _next;
 | 
			
		||||
        private readonly IRequestCreator _requestCreator;
 | 
			
		||||
        private readonly IOcelotLogger _logger;
 | 
			
		||||
 | 
			
		||||
        public HttpRequestBuilderMiddleware(RequestDelegate next, 
 | 
			
		||||
        public HttpRequestBuilderMiddleware(RequestDelegate next,
 | 
			
		||||
            IOcelotLoggerFactory loggerFactory,
 | 
			
		||||
            IRequestScopedDataRepository requestScopedDataRepository, 
 | 
			
		||||
            IRequestCreator requestCreator)
 | 
			
		||||
            :base(requestScopedDataRepository)
 | 
			
		||||
        {
 | 
			
		||||
            _next = next;
 | 
			
		||||
            _requestCreator = requestCreator;
 | 
			
		||||
            _logger = loggerFactory.CreateLogger<HttpRequestBuilderMiddleware>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task Invoke(HttpContext context)
 | 
			
		||||
        {
 | 
			
		||||
            _logger.LogDebug("started calling request builder middleware");
 | 
			
		||||
 | 
			
		||||
            var buildResult = await _requestCreator
 | 
			
		||||
                .Build(context.Request.Method, DownstreamUrl, context.Request.Body,
 | 
			
		||||
                    context.Request.Headers, context.Request.Cookies, context.Request.QueryString,
 | 
			
		||||
@@ -29,13 +36,20 @@ namespace Ocelot.Request.Middleware
 | 
			
		||||
 | 
			
		||||
            if (buildResult.IsError)
 | 
			
		||||
            {
 | 
			
		||||
                _logger.LogDebug("IRequestCreator returned an error, setting pipeline error");
 | 
			
		||||
 | 
			
		||||
                SetPipelineError(buildResult.Errors);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            _logger.LogDebug("setting upstream request");
 | 
			
		||||
 | 
			
		||||
            SetUpstreamRequestForThisRequest(buildResult.Data);
 | 
			
		||||
 | 
			
		||||
            _logger.LogDebug("calling next middleware");
 | 
			
		||||
 | 
			
		||||
            await _next.Invoke(context);
 | 
			
		||||
 | 
			
		||||
            _logger.LogDebug("succesfully called next middleware");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -3,6 +3,7 @@ using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.Extensions.Primitives;
 | 
			
		||||
using Ocelot.Infrastructure.RequestData;
 | 
			
		||||
using Ocelot.Logging;
 | 
			
		||||
using Ocelot.Middleware;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.RequestId.Middleware
 | 
			
		||||
@@ -10,22 +11,35 @@ namespace Ocelot.RequestId.Middleware
 | 
			
		||||
    public class RequestIdMiddleware : OcelotMiddleware
 | 
			
		||||
    {
 | 
			
		||||
        private readonly RequestDelegate _next;
 | 
			
		||||
        private readonly IOcelotLogger _logger;
 | 
			
		||||
        private readonly IRequestScopedDataRepository _requestScopedDataRepository;
 | 
			
		||||
 | 
			
		||||
        public RequestIdMiddleware(RequestDelegate next, 
 | 
			
		||||
        public RequestIdMiddleware(RequestDelegate next,
 | 
			
		||||
            IOcelotLoggerFactory loggerFactory,
 | 
			
		||||
            IRequestScopedDataRepository requestScopedDataRepository)
 | 
			
		||||
            :base(requestScopedDataRepository)
 | 
			
		||||
        {
 | 
			
		||||
            _next = next;
 | 
			
		||||
            _logger = loggerFactory.CreateLogger<RequestIdMiddleware>();
 | 
			
		||||
            _requestScopedDataRepository = requestScopedDataRepository;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task Invoke(HttpContext context)
 | 
			
		||||
        {
 | 
			
		||||
            SetTraceIdentifier(context);
 | 
			
		||||
        {         
 | 
			
		||||
            _logger.LogDebug("started calling request id middleware");
 | 
			
		||||
 | 
			
		||||
            SetOcelotRequestId(context);
 | 
			
		||||
 | 
			
		||||
            _logger.LogDebug("set request id");
 | 
			
		||||
 | 
			
		||||
            _logger.LogDebug("calling next middleware");
 | 
			
		||||
 | 
			
		||||
            await _next.Invoke(context);
 | 
			
		||||
            
 | 
			
		||||
            _logger.LogDebug("succesfully called next middleware");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void SetTraceIdentifier(HttpContext context)
 | 
			
		||||
        private void SetOcelotRequestId(HttpContext context)
 | 
			
		||||
        {
 | 
			
		||||
            var key = DefaultRequestIdKey.Value;
 | 
			
		||||
 | 
			
		||||
@@ -38,6 +52,8 @@ namespace Ocelot.RequestId.Middleware
 | 
			
		||||
 | 
			
		||||
            if (context.Request.Headers.TryGetValue(key, out requestId))
 | 
			
		||||
            {
 | 
			
		||||
                _requestScopedDataRepository.Add("RequestId", requestId.First());
 | 
			
		||||
 | 
			
		||||
                context.TraceIdentifier = requestId;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,8 @@
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Ocelot.Infrastructure.RequestData;
 | 
			
		||||
using Ocelot.Logging;
 | 
			
		||||
using Ocelot.Middleware;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.Requester.Middleware
 | 
			
		||||
@@ -9,27 +11,38 @@ namespace Ocelot.Requester.Middleware
 | 
			
		||||
    {
 | 
			
		||||
        private readonly RequestDelegate _next;
 | 
			
		||||
        private readonly IHttpRequester _requester;
 | 
			
		||||
        private readonly IOcelotLogger _logger;
 | 
			
		||||
 | 
			
		||||
        public HttpRequesterMiddleware(RequestDelegate next, 
 | 
			
		||||
        public HttpRequesterMiddleware(RequestDelegate next,
 | 
			
		||||
            IOcelotLoggerFactory loggerFactory,
 | 
			
		||||
            IHttpRequester requester, 
 | 
			
		||||
            IRequestScopedDataRepository requestScopedDataRepository)
 | 
			
		||||
            :base(requestScopedDataRepository)
 | 
			
		||||
        {
 | 
			
		||||
            _next = next;
 | 
			
		||||
            _requester = requester;
 | 
			
		||||
            _logger = loggerFactory.CreateLogger<HttpRequesterMiddleware>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task Invoke(HttpContext context)
 | 
			
		||||
        {
 | 
			
		||||
            _logger.LogDebug("started calling requester middleware");
 | 
			
		||||
 | 
			
		||||
            var response = await _requester.GetResponse(Request);
 | 
			
		||||
 | 
			
		||||
            if (response.IsError)
 | 
			
		||||
            {
 | 
			
		||||
                _logger.LogDebug("IHttpRequester returned an error, setting pipeline error");
 | 
			
		||||
 | 
			
		||||
                SetPipelineError(response.Errors);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            _logger.LogDebug("setting http response message");
 | 
			
		||||
 | 
			
		||||
            SetHttpResponseMessageThisRequest(response.Data);
 | 
			
		||||
 | 
			
		||||
            _logger.LogDebug("returning to calling middleware");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,12 +0,0 @@
 | 
			
		||||
using Microsoft.AspNetCore.Builder;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.Responder.Middleware
 | 
			
		||||
{
 | 
			
		||||
    public static class HttpResponderMiddlewareExtensions
 | 
			
		||||
    {
 | 
			
		||||
        public static IApplicationBuilder UseHttpErrorResponderMiddleware(this IApplicationBuilder builder)
 | 
			
		||||
        {
 | 
			
		||||
            return builder.UseMiddleware<HttpErrorResponderMiddleware>();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,20 +1,24 @@
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Ocelot.Errors;
 | 
			
		||||
using Ocelot.Infrastructure.RequestData;
 | 
			
		||||
using Ocelot.Logging;
 | 
			
		||||
using Ocelot.Middleware;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.Responder.Middleware
 | 
			
		||||
{
 | 
			
		||||
    public class HttpErrorResponderMiddleware : OcelotMiddleware
 | 
			
		||||
    public class ResponderMiddleware : OcelotMiddleware
 | 
			
		||||
    {
 | 
			
		||||
        private readonly RequestDelegate _next;
 | 
			
		||||
        private readonly IHttpResponder _responder;
 | 
			
		||||
        private readonly IErrorsToHttpStatusCodeMapper _codeMapper;
 | 
			
		||||
        private readonly IOcelotLogger _logger;
 | 
			
		||||
 | 
			
		||||
        public HttpErrorResponderMiddleware(RequestDelegate next, 
 | 
			
		||||
        public ResponderMiddleware(RequestDelegate next, 
 | 
			
		||||
            IHttpResponder responder,
 | 
			
		||||
            IOcelotLoggerFactory loggerFactory,
 | 
			
		||||
            IRequestScopedDataRepository requestScopedDataRepository, 
 | 
			
		||||
            IErrorsToHttpStatusCodeMapper codeMapper)
 | 
			
		||||
            :base(requestScopedDataRepository)
 | 
			
		||||
@@ -22,24 +26,38 @@ namespace Ocelot.Responder.Middleware
 | 
			
		||||
            _next = next;
 | 
			
		||||
            _responder = responder;
 | 
			
		||||
            _codeMapper = codeMapper;
 | 
			
		||||
            _logger = loggerFactory.CreateLogger<ResponderMiddleware>();
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task Invoke(HttpContext context)
 | 
			
		||||
        {
 | 
			
		||||
            _logger.LogDebug("started error responder middleware");
 | 
			
		||||
 | 
			
		||||
            await _next.Invoke(context);
 | 
			
		||||
 | 
			
		||||
            if (PipelineError())
 | 
			
		||||
            _logger.LogDebug("calling next middleware");
 | 
			
		||||
 | 
			
		||||
            if (PipelineError)
 | 
			
		||||
            {
 | 
			
		||||
                var errors = GetPipelineErrors();
 | 
			
		||||
                _logger.LogDebug("there is a pipeline error, getting errors");
 | 
			
		||||
 | 
			
		||||
                var errors = PipelineErrors;
 | 
			
		||||
 | 
			
		||||
                _logger.LogDebug("received errors setting error response");
 | 
			
		||||
 | 
			
		||||
                await SetErrorResponse(context, errors);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                _logger.LogDebug("no pipeline error, setting response");
 | 
			
		||||
 | 
			
		||||
                var setResponse = await _responder.SetResponseOnHttpContext(context, HttpResponseMessage);
 | 
			
		||||
 | 
			
		||||
                if (setResponse.IsError)
 | 
			
		||||
                {
 | 
			
		||||
                    _logger.LogDebug("error setting response, returning error to client");
 | 
			
		||||
 | 
			
		||||
                    await SetErrorResponse(context, setResponse.Errors);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -0,0 +1,12 @@
 | 
			
		||||
using Microsoft.AspNetCore.Builder;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.Responder.Middleware
 | 
			
		||||
{
 | 
			
		||||
    public static class ResponderMiddlewareExtensions
 | 
			
		||||
    {
 | 
			
		||||
        public static IApplicationBuilder UseResponderMiddleware(this IApplicationBuilder builder)
 | 
			
		||||
        {
 | 
			
		||||
            return builder.UseMiddleware<ResponderMiddleware>();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user