From 58b82f0fc7a69324d1dcde35e84c4f04fe3647f5 Mon Sep 17 00:00:00 2001 From: Pitming Date: Fri, 8 Nov 2019 12:59:34 +0100 Subject: [PATCH] Add DownstreamHttpMethodCreatorMiddleware --- .../Builder/DownstreamReRouteBuilder.cs | 10 ++++++- .../Configuration/Creator/ReRoutesCreator.cs | 1 + src/Ocelot/Configuration/DownstreamReRoute.cs | 5 +++- src/Ocelot/Configuration/File/FileReRoute.cs | 1 + .../DownstreamHttpMethodCreatorMiddleware.cs | 27 +++++++++++++++++++ .../Request/Middleware/DownstreamRequest.cs | 4 ++- .../HttpRequestBuilderMiddlewareExtensions.cs | 4 ++- 7 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 src/Ocelot/DownstreamUrlCreator/Middleware/DownstreamHttpMethodCreatorMiddleware.cs diff --git a/src/Ocelot/Configuration/Builder/DownstreamReRouteBuilder.cs b/src/Ocelot/Configuration/Builder/DownstreamReRouteBuilder.cs index 4b3e6ea3..ed978dde 100644 --- a/src/Ocelot/Configuration/Builder/DownstreamReRouteBuilder.cs +++ b/src/Ocelot/Configuration/Builder/DownstreamReRouteBuilder.cs @@ -41,6 +41,7 @@ namespace Ocelot.Configuration.Builder private List _addHeadersToUpstream; private bool _dangerousAcceptAnyServerCertificateValidator; private SecurityOptions _securityOptions; + private string _downstreamHttpMethod; public DownstreamReRouteBuilder() { @@ -56,6 +57,12 @@ namespace Ocelot.Configuration.Builder return this; } + public DownstreamReRouteBuilder WithDownStreamHttpMethod(string method) + { + _downstreamHttpMethod = method; + return this; + } + public DownstreamReRouteBuilder WithLoadBalancerOptions(LoadBalancerOptions loadBalancerOptions) { _loadBalancerOptions = loadBalancerOptions; @@ -282,7 +289,8 @@ namespace Ocelot.Configuration.Builder _addHeadersToDownstream, _addHeadersToUpstream, _dangerousAcceptAnyServerCertificateValidator, - _securityOptions); + _securityOptions, + _downstreamHttpMethod); } } } diff --git a/src/Ocelot/Configuration/Creator/ReRoutesCreator.cs b/src/Ocelot/Configuration/Creator/ReRoutesCreator.cs index 4443e201..1cc463ef 100644 --- a/src/Ocelot/Configuration/Creator/ReRoutesCreator.cs +++ b/src/Ocelot/Configuration/Creator/ReRoutesCreator.cs @@ -138,6 +138,7 @@ namespace Ocelot.Configuration.Creator .WithAddHeadersToUpstream(hAndRs.AddHeadersToUpstream) .WithDangerousAcceptAnyServerCertificateValidator(fileReRoute.DangerousAcceptAnyServerCertificateValidator) .WithSecurityOptions(securityOptions) + .WithDownStreamHttpMethod(fileReRoute.DownstreamHttpMethod) .Build(); return reRoute; diff --git a/src/Ocelot/Configuration/DownstreamReRoute.cs b/src/Ocelot/Configuration/DownstreamReRoute.cs index e8dfade5..1c41f648 100644 --- a/src/Ocelot/Configuration/DownstreamReRoute.cs +++ b/src/Ocelot/Configuration/DownstreamReRoute.cs @@ -38,7 +38,8 @@ namespace Ocelot.Configuration List addHeadersToDownstream, List addHeadersToUpstream, bool dangerousAcceptAnyServerCertificateValidator, - SecurityOptions securityOptions) + SecurityOptions securityOptions, + string downstreamHttpMethod) { DangerousAcceptAnyServerCertificateValidator = dangerousAcceptAnyServerCertificateValidator; AddHeadersToDownstream = addHeadersToDownstream; @@ -72,6 +73,7 @@ namespace Ocelot.Configuration LoadBalancerKey = loadBalancerKey; AddHeadersToUpstream = addHeadersToUpstream; SecurityOptions = securityOptions; + DownstreamHttpMethod = downstreamHttpMethod; } public string Key { get; } @@ -106,5 +108,6 @@ namespace Ocelot.Configuration public List AddHeadersToUpstream { get; } public bool DangerousAcceptAnyServerCertificateValidator { get; } public SecurityOptions SecurityOptions { get; } + public string DownstreamHttpMethod { get; } } } diff --git a/src/Ocelot/Configuration/File/FileReRoute.cs b/src/Ocelot/Configuration/File/FileReRoute.cs index b15653ea..1bae31dd 100644 --- a/src/Ocelot/Configuration/File/FileReRoute.cs +++ b/src/Ocelot/Configuration/File/FileReRoute.cs @@ -29,6 +29,7 @@ namespace Ocelot.Configuration.File public string DownstreamPathTemplate { get; set; } public string UpstreamPathTemplate { get; set; } public List UpstreamHttpMethod { get; set; } + public string DownstreamHttpMethod { get; set; } public Dictionary AddHeadersToRequest { get; set; } public Dictionary UpstreamHeaderTransform { get; set; } public Dictionary DownstreamHeaderTransform { get; set; } diff --git a/src/Ocelot/DownstreamUrlCreator/Middleware/DownstreamHttpMethodCreatorMiddleware.cs b/src/Ocelot/DownstreamUrlCreator/Middleware/DownstreamHttpMethodCreatorMiddleware.cs new file mode 100644 index 00000000..6689c0c1 --- /dev/null +++ b/src/Ocelot/DownstreamUrlCreator/Middleware/DownstreamHttpMethodCreatorMiddleware.cs @@ -0,0 +1,27 @@ +using Ocelot.Logging; +using Ocelot.Middleware; +using System.Threading.Tasks; + +namespace Ocelot.DownstreamUrlCreator.Middleware +{ + public class DownstreamHttpMethodCreatorMiddleware : OcelotMiddleware + { + private readonly OcelotRequestDelegate _next; + + public DownstreamHttpMethodCreatorMiddleware(OcelotRequestDelegate next, IOcelotLoggerFactory loggerFactory) + : base(loggerFactory.CreateLogger()) + { + _next = next; + } + + public async Task Invoke(DownstreamContext context) + { + if (context.DownstreamReRoute.DownstreamHttpMethod != null) + { + context.DownstreamRequest.Method = context.DownstreamReRoute.DownstreamHttpMethod; + } + + await _next.Invoke(context); + } + } +} diff --git a/src/Ocelot/Request/Middleware/DownstreamRequest.cs b/src/Ocelot/Request/Middleware/DownstreamRequest.cs index 256436e5..1715b387 100644 --- a/src/Ocelot/Request/Middleware/DownstreamRequest.cs +++ b/src/Ocelot/Request/Middleware/DownstreamRequest.cs @@ -24,7 +24,7 @@ namespace Ocelot.Request.Middleware public HttpRequestHeaders Headers { get; } - public string Method { get; } + public string Method { get; set; } public string OriginalString { get; } @@ -52,6 +52,8 @@ namespace Ocelot.Request.Middleware }; _request.RequestUri = uriBuilder.Uri; + _request.Method = new HttpMethod(Method); + _request.Content = Content; return _request; } diff --git a/src/Ocelot/Request/Middleware/HttpRequestBuilderMiddlewareExtensions.cs b/src/Ocelot/Request/Middleware/HttpRequestBuilderMiddlewareExtensions.cs index 2d803e1e..6c43507c 100644 --- a/src/Ocelot/Request/Middleware/HttpRequestBuilderMiddlewareExtensions.cs +++ b/src/Ocelot/Request/Middleware/HttpRequestBuilderMiddlewareExtensions.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Builder; +using Ocelot.DownstreamUrlCreator.Middleware; using Ocelot.Middleware.Pipeline; namespace Ocelot.Request.Middleware @@ -7,7 +8,8 @@ namespace Ocelot.Request.Middleware { public static IOcelotPipelineBuilder UseDownstreamRequestInitialiser(this IOcelotPipelineBuilder builder) { - return builder.UseMiddleware(); + return builder.UseMiddleware() + .UseMiddleware(); } } }