mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-04-22 06:22:50 +08:00
removed some code we dont need as not expecting any errors so should just throw an exception to the global handler
This commit is contained in:
parent
a4495b8fa9
commit
0a66051b92
@ -41,13 +41,13 @@ namespace Ocelot.Errors.Middleware
|
|||||||
|
|
||||||
var message = CreateMessage(context, e);
|
var message = CreateMessage(context, e);
|
||||||
_logger.LogError(message, e);
|
_logger.LogError(message, e);
|
||||||
await SetInternalServerErrorOnResponse(context);
|
SetInternalServerErrorOnResponse(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogDebug("ocelot pipeline finished");
|
_logger.LogDebug("ocelot pipeline finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SetInternalServerErrorOnResponse(HttpContext context)
|
private void SetInternalServerErrorOnResponse(HttpContext context)
|
||||||
{
|
{
|
||||||
context.Response.OnStarting(x =>
|
context.Response.OnStarting(x =>
|
||||||
{
|
{
|
||||||
|
@ -8,6 +8,6 @@ namespace Ocelot.LoadBalancer.LoadBalancers
|
|||||||
public interface ILoadBalancer
|
public interface ILoadBalancer
|
||||||
{
|
{
|
||||||
Task<Response<HostAndPort>> Lease();
|
Task<Response<HostAndPort>> Lease();
|
||||||
Response Release(HostAndPort hostAndPort);
|
void Release(HostAndPort hostAndPort);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -53,7 +53,7 @@ namespace Ocelot.LoadBalancer.LoadBalancers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Response Release(HostAndPort hostAndPort)
|
public void Release(HostAndPort hostAndPort)
|
||||||
{
|
{
|
||||||
lock(_syncLock)
|
lock(_syncLock)
|
||||||
{
|
{
|
||||||
@ -69,8 +69,6 @@ namespace Ocelot.LoadBalancer.LoadBalancers
|
|||||||
_leases.Add(replacementLease);
|
_leases.Add(replacementLease);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new OkResponse();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Lease AddConnection(Lease lease)
|
private Lease AddConnection(Lease lease)
|
||||||
|
@ -17,13 +17,12 @@ namespace Ocelot.LoadBalancer.LoadBalancers
|
|||||||
|
|
||||||
public async Task<Response<HostAndPort>> Lease()
|
public async Task<Response<HostAndPort>> Lease()
|
||||||
{
|
{
|
||||||
var service = _services.FirstOrDefault();
|
var service = await Task.FromResult(_services.FirstOrDefault());
|
||||||
return new OkResponse<HostAndPort>(service.HostAndPort);
|
return new OkResponse<HostAndPort>(service.HostAndPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Response Release(HostAndPort hostAndPort)
|
public void Release(HostAndPort hostAndPort)
|
||||||
{
|
{
|
||||||
return new OkResponse();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,14 +22,13 @@ namespace Ocelot.LoadBalancer.LoadBalancers
|
|||||||
_last = 0;
|
_last = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var next = _services[_last];
|
var next = await Task.FromResult(_services[_last]);
|
||||||
_last++;
|
_last++;
|
||||||
return new OkResponse<HostAndPort>(next.HostAndPort);
|
return new OkResponse<HostAndPort>(next.HostAndPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Response Release(HostAndPort hostAndPort)
|
public void Release(HostAndPort hostAndPort)
|
||||||
{
|
{
|
||||||
return new OkResponse();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,14 +31,14 @@ namespace Ocelot.LoadBalancer.Middleware
|
|||||||
{
|
{
|
||||||
_logger.LogDebug("started calling load balancing middleware");
|
_logger.LogDebug("started calling load balancing middleware");
|
||||||
|
|
||||||
var getLoadBalancer = _loadBalancerHouse.Get(DownstreamRoute.ReRoute.LoadBalancerKey);
|
var loadBalancer = _loadBalancerHouse.Get(DownstreamRoute.ReRoute.LoadBalancerKey);
|
||||||
if(getLoadBalancer.IsError)
|
if(loadBalancer.IsError)
|
||||||
{
|
{
|
||||||
SetPipelineError(getLoadBalancer.Errors);
|
SetPipelineError(loadBalancer.Errors);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var hostAndPort = await getLoadBalancer.Data.Lease();
|
var hostAndPort = await loadBalancer.Data.Lease();
|
||||||
if(hostAndPort.IsError)
|
if(hostAndPort.IsError)
|
||||||
{
|
{
|
||||||
SetPipelineError(hostAndPort.Errors);
|
SetPipelineError(hostAndPort.Errors);
|
||||||
@ -53,11 +53,12 @@ namespace Ocelot.LoadBalancer.Middleware
|
|||||||
{
|
{
|
||||||
await _next.Invoke(context);
|
await _next.Invoke(context);
|
||||||
|
|
||||||
getLoadBalancer.Data.Release(hostAndPort.Data);
|
loadBalancer.Data.Release(hostAndPort.Data);
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
getLoadBalancer.Data.Release(hostAndPort.Data);
|
loadBalancer.Data.Release(hostAndPort.Data);
|
||||||
|
|
||||||
_logger.LogDebug("error calling next middleware, exception will be thrown to global handler");
|
_logger.LogDebug("error calling next middleware, exception will be thrown to global handler");
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ namespace Ocelot.Responder
|
|||||||
_removeOutputHeaders = removeOutputHeaders;
|
_removeOutputHeaders = removeOutputHeaders;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Response> SetResponseOnHttpContext(HttpContext context, HttpResponseMessage response)
|
public async Task SetResponseOnHttpContext(HttpContext context, HttpResponseMessage response)
|
||||||
{
|
{
|
||||||
_removeOutputHeaders.Remove(response.Headers);
|
_removeOutputHeaders.Remove(response.Headers);
|
||||||
|
|
||||||
@ -56,7 +56,6 @@ namespace Ocelot.Responder
|
|||||||
{
|
{
|
||||||
await stream.CopyToAsync(context.Response.Body);
|
await stream.CopyToAsync(context.Response.Body);
|
||||||
}
|
}
|
||||||
return new OkResponse();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void AddHeaderIfDoesntExist(HttpContext context, KeyValuePair<string, IEnumerable<string>> httpResponseHeader)
|
private static void AddHeaderIfDoesntExist(HttpContext context, KeyValuePair<string, IEnumerable<string>> httpResponseHeader)
|
||||||
@ -67,14 +66,13 @@ namespace Ocelot.Responder
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Response> SetErrorResponseOnContext(HttpContext context, int statusCode)
|
public void SetErrorResponseOnContext(HttpContext context, int statusCode)
|
||||||
{
|
{
|
||||||
context.Response.OnStarting(x =>
|
context.Response.OnStarting(x =>
|
||||||
{
|
{
|
||||||
context.Response.StatusCode = statusCode;
|
context.Response.StatusCode = statusCode;
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}, context);
|
}, context);
|
||||||
return new OkResponse();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,13 +1,12 @@
|
|||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Ocelot.Responses;
|
|
||||||
|
|
||||||
namespace Ocelot.Responder
|
namespace Ocelot.Responder
|
||||||
{
|
{
|
||||||
public interface IHttpResponder
|
public interface IHttpResponder
|
||||||
{
|
{
|
||||||
Task<Response> SetResponseOnHttpContext(HttpContext context, HttpResponseMessage response);
|
Task SetResponseOnHttpContext(HttpContext context, HttpResponseMessage response);
|
||||||
Task<Response> SetErrorResponseOnContext(HttpContext context, int statusCode);
|
void SetErrorResponseOnContext(HttpContext context, int statusCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,34 +46,27 @@ namespace Ocelot.Responder.Middleware
|
|||||||
|
|
||||||
_logger.LogDebug("received errors setting error response");
|
_logger.LogDebug("received errors setting error response");
|
||||||
|
|
||||||
await SetErrorResponse(context, errors);
|
SetErrorResponse(context, errors);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_logger.LogDebug("no pipeline error, setting response");
|
_logger.LogDebug("no pipeline error, setting response");
|
||||||
|
|
||||||
var setResponse = await _responder.SetResponseOnHttpContext(context, HttpResponseMessage);
|
await _responder.SetResponseOnHttpContext(context, HttpResponseMessage);
|
||||||
|
|
||||||
if (setResponse.IsError)
|
|
||||||
{
|
|
||||||
_logger.LogDebug("error setting response, returning error to client");
|
|
||||||
|
|
||||||
await SetErrorResponse(context, setResponse.Errors);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SetErrorResponse(HttpContext context, List<Error> errors)
|
private void SetErrorResponse(HttpContext context, List<Error> errors)
|
||||||
{
|
{
|
||||||
var statusCode = _codeMapper.Map(errors);
|
var statusCode = _codeMapper.Map(errors);
|
||||||
|
|
||||||
if (!statusCode.IsError)
|
if (!statusCode.IsError)
|
||||||
{
|
{
|
||||||
await _responder.SetErrorResponseOnContext(context, statusCode.Data);
|
_responder.SetErrorResponseOnContext(context, statusCode.Data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await _responder.SetErrorResponseOnContext(context, 500);
|
_responder.SetErrorResponseOnContext(context, 500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ namespace Ocelot.ServiceDiscovery
|
|||||||
|
|
||||||
public async Task<List<Service>> Get()
|
public async Task<List<Service>> Get()
|
||||||
{
|
{
|
||||||
return _services;
|
return await Task.FromResult(_services);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -51,7 +51,7 @@ namespace Ocelot.UnitTests.LoadBalancer
|
|||||||
{
|
{
|
||||||
var hostAndPort = await _leastConnection.Lease();
|
var hostAndPort = await _leastConnection.Lease();
|
||||||
await Task.Delay(_random.Next(1, 100));
|
await Task.Delay(_random.Next(1, 100));
|
||||||
var response = _leastConnection.Release(hostAndPort.Data);
|
_leastConnection.Release(hostAndPort.Data);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
@ -114,7 +114,7 @@ namespace Ocelot.UnitTests.LoadBalancer
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Response Release(HostAndPort hostAndPort)
|
public void Release(HostAndPort hostAndPort)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -127,7 +127,7 @@ namespace Ocelot.UnitTests.LoadBalancer
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Response Release(HostAndPort hostAndPort)
|
public void Release(HostAndPort hostAndPort)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
@ -170,6 +170,15 @@ namespace Ocelot.UnitTests.LoadBalancer
|
|||||||
.Verify(x => x.Add("OcelotMiddlewareErrors", _getLoadBalancerHouseError.Errors), Times.Once);
|
.Verify(x => x.Add("OcelotMiddlewareErrors", _getLoadBalancerHouseError.Errors), Times.Once);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ThenAnErrorSayingReleaseFailedIsSetOnThePipeline()
|
||||||
|
{
|
||||||
|
_scopedRepository
|
||||||
|
.Verify(x => x.Add("OcelotMiddlewareError", true), Times.Once);
|
||||||
|
|
||||||
|
_scopedRepository
|
||||||
|
.Verify(x => x.Add("OcelotMiddlewareErrors", It.IsAny<List<Error>>()), Times.Once);
|
||||||
|
}
|
||||||
|
|
||||||
private void ThenAnErrorStatingHostAndPortCouldNotBeFoundIsSetOnPipeline()
|
private void ThenAnErrorStatingHostAndPortCouldNotBeFoundIsSetOnPipeline()
|
||||||
{
|
{
|
||||||
_scopedRepository
|
_scopedRepository
|
||||||
|
@ -62,19 +62,11 @@ namespace Ocelot.UnitTests.Responder
|
|||||||
{
|
{
|
||||||
this.Given(x => x.GivenTheHttpResponseMessageIs(new HttpResponseMessage()))
|
this.Given(x => x.GivenTheHttpResponseMessageIs(new HttpResponseMessage()))
|
||||||
.And(x => x.GivenThereAreNoPipelineErrors())
|
.And(x => x.GivenThereAreNoPipelineErrors())
|
||||||
.And(x => x.GivenTheResponderReturns())
|
|
||||||
.When(x => x.WhenICallTheMiddleware())
|
.When(x => x.WhenICallTheMiddleware())
|
||||||
.Then(x => x.ThenThereAreNoErrors())
|
.Then(x => x.ThenThereAreNoErrors())
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GivenTheResponderReturns()
|
|
||||||
{
|
|
||||||
_responder
|
|
||||||
.Setup(x => x.SetResponseOnHttpContext(It.IsAny<HttpContext>(), It.IsAny<HttpResponseMessage>()))
|
|
||||||
.ReturnsAsync(new OkResponse());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GivenThereAreNoPipelineErrors()
|
private void GivenThereAreNoPipelineErrors()
|
||||||
{
|
{
|
||||||
_scopedRepository
|
_scopedRepository
|
||||||
|
Loading…
x
Reference in New Issue
Block a user