mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-06-19 08:18:16 +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