mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-11-04 23:30:50 +08:00 
			
		
		
		
	Feature/inject error mapper (#562)
* added delegate to select last handler * #529 implemented a way we can inject the last delegating handler * wip - moving code * #529 removed loads of qos code and moved it into Ocelot.Provider.Polly * #529 can now inject http client expcetions to ocelot errors mappers and updated docs
This commit is contained in:
		@@ -7,8 +7,6 @@
 | 
			
		||||
            int durationofBreak, 
 | 
			
		||||
            int timeoutValue, 
 | 
			
		||||
            string key,
 | 
			
		||||
            //todo - this is never set in Ocelot so always Pessimistic...I guess it doesn't
 | 
			
		||||
            //matter to much.
 | 
			
		||||
            string timeoutStrategy = "Pessimistic")
 | 
			
		||||
        {
 | 
			
		||||
            ExceptionsAllowedBeforeBreaking = exceptionsAllowedBeforeBreaking;
 | 
			
		||||
 
 | 
			
		||||
@@ -130,6 +130,7 @@ namespace Ocelot.DependencyInjection
 | 
			
		||||
            Services.TryAddSingleton<IDownstreamRequestCreator, DownstreamRequestCreator>();
 | 
			
		||||
            Services.TryAddSingleton<IFrameworkDescription, FrameworkDescription>();
 | 
			
		||||
            Services.TryAddSingleton<IQoSFactory, QoSFactory>();
 | 
			
		||||
            Services.TryAddSingleton<IExceptionToErrorMapper, HttpExeptionToErrorMapper>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public IOcelotBuilder AddSingletonDefinedAggregator<T>() 
 | 
			
		||||
 
 | 
			
		||||
@@ -12,14 +12,17 @@ namespace Ocelot.Requester
 | 
			
		||||
        private readonly IHttpClientCache _cacheHandlers;
 | 
			
		||||
        private readonly IOcelotLogger _logger;
 | 
			
		||||
        private readonly IDelegatingHandlerHandlerFactory _factory;
 | 
			
		||||
        private readonly IExceptionToErrorMapper _mapper;
 | 
			
		||||
 | 
			
		||||
        public HttpClientHttpRequester(IOcelotLoggerFactory loggerFactory,
 | 
			
		||||
            IHttpClientCache cacheHandlers,
 | 
			
		||||
            IDelegatingHandlerHandlerFactory house)
 | 
			
		||||
            IDelegatingHandlerHandlerFactory factory, 
 | 
			
		||||
            IExceptionToErrorMapper mapper)
 | 
			
		||||
        {
 | 
			
		||||
            _logger = loggerFactory.CreateLogger<HttpClientHttpRequester>();
 | 
			
		||||
            _cacheHandlers = cacheHandlers;
 | 
			
		||||
            _factory = house;
 | 
			
		||||
            _factory = factory;
 | 
			
		||||
            _mapper = mapper;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<Response<HttpResponseMessage>> GetResponse(DownstreamContext context)
 | 
			
		||||
@@ -35,7 +38,8 @@ namespace Ocelot.Requester
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception exception)
 | 
			
		||||
            {
 | 
			
		||||
                return new ErrorResponse<HttpResponseMessage>(new UnableToCompleteRequestError(exception));
 | 
			
		||||
                var error = _mapper.Map(exception);
 | 
			
		||||
                return new ErrorResponse<HttpResponseMessage>(error);
 | 
			
		||||
            }
 | 
			
		||||
            finally
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										29
									
								
								src/Ocelot/Requester/HttpExeptionToErrorMapper.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/Ocelot/Requester/HttpExeptionToErrorMapper.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
namespace Ocelot.Requester
 | 
			
		||||
{
 | 
			
		||||
    using System;
 | 
			
		||||
    using System.Collections.Generic;
 | 
			
		||||
    using Errors;
 | 
			
		||||
    using Microsoft.Extensions.DependencyInjection;
 | 
			
		||||
 | 
			
		||||
    public class HttpExeptionToErrorMapper : IExceptionToErrorMapper
 | 
			
		||||
    {
 | 
			
		||||
        private readonly Dictionary<Type, Func<Exception, Error>> _mappers;
 | 
			
		||||
 | 
			
		||||
        public HttpExeptionToErrorMapper(IServiceProvider serviceProvider)
 | 
			
		||||
        {
 | 
			
		||||
            _mappers = serviceProvider.GetService<Dictionary<Type, Func<Exception, Error>>>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Error Map(Exception exception)
 | 
			
		||||
        {
 | 
			
		||||
            var type = exception.GetType();
 | 
			
		||||
 | 
			
		||||
            if (_mappers != null && _mappers.ContainsKey(type))
 | 
			
		||||
            {
 | 
			
		||||
                return _mappers[type](exception);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return new UnableToCompleteRequestError(exception);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								src/Ocelot/Requester/IExceptionToErrorMapper.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/Ocelot/Requester/IExceptionToErrorMapper.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
using System;
 | 
			
		||||
using Ocelot.Errors;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.Requester
 | 
			
		||||
{
 | 
			
		||||
    public interface IExceptionToErrorMapper
 | 
			
		||||
    {
 | 
			
		||||
        Error Map(Exception exception);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
using System.Net.Http;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.Requester
 | 
			
		||||
{
 | 
			
		||||
    public class ReRouteDelegatingHandler<T> 
 | 
			
		||||
        where T : DelegatingHandler
 | 
			
		||||
    {
 | 
			
		||||
        public T DelegatingHandler { get; private set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,12 +0,0 @@
 | 
			
		||||
using Ocelot.Errors;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.Requester
 | 
			
		||||
{
 | 
			
		||||
    public class UnableToFindDelegatingHandlerProviderError : Error
 | 
			
		||||
    {
 | 
			
		||||
        public UnableToFindDelegatingHandlerProviderError(string message)
 | 
			
		||||
            : base(message, OcelotErrorCode.UnableToFindDelegatingHandlerProviderError)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user