diff --git a/src/Ocelot/Claims/AddClaimsToRequest.cs b/src/Ocelot/Claims/AddClaimsToRequest.cs index aa1237a8..9ff0254f 100644 --- a/src/Ocelot/Claims/AddClaimsToRequest.cs +++ b/src/Ocelot/Claims/AddClaimsToRequest.cs @@ -1,46 +1,46 @@ -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using Microsoft.AspNetCore.Http; -using Ocelot.Configuration; -using Ocelot.Infrastructure.Claims.Parser; -using Ocelot.Responses; - -namespace Ocelot.Claims -{ - public class AddClaimsToRequest : IAddClaimsToRequest - { - private readonly IClaimsParser _claimsParser; - - public AddClaimsToRequest(IClaimsParser claimsParser) - { - _claimsParser = claimsParser; - } - - public Response SetClaimsOnContext(List claimsToThings, HttpContext context) - { - foreach (var config in claimsToThings) - { - var value = _claimsParser.GetValue(context.User.Claims, config.NewKey, config.Delimiter, config.Index); - - if (value.IsError) - { - return new ErrorResponse(value.Errors); - } - - var exists = context.User.Claims.FirstOrDefault(x => x.Type == config.ExistingKey); - - var identity = context.User.Identity as ClaimsIdentity; - - if (exists != null) - { - identity?.RemoveClaim(exists); - } - - identity?.AddClaim(new System.Security.Claims.Claim(config.ExistingKey, value.Data)); - } - - return new OkResponse(); - } - } -} \ No newline at end of file +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using Microsoft.AspNetCore.Http; +using Ocelot.Configuration; +using Ocelot.Infrastructure.Claims.Parser; +using Ocelot.Responses; + +namespace Ocelot.Claims +{ + public class AddClaimsToRequest : IAddClaimsToRequest + { + private readonly IClaimsParser _claimsParser; + + public AddClaimsToRequest(IClaimsParser claimsParser) + { + _claimsParser = claimsParser; + } + + public Response SetClaimsOnContext(List claimsToThings, HttpContext context) + { + foreach (var config in claimsToThings) + { + var value = _claimsParser.GetValue(context.User.Claims, config.NewKey, config.Delimiter, config.Index); + + if (value.IsError) + { + return new ErrorResponse(value.Errors); + } + + var exists = context.User.Claims.FirstOrDefault(x => x.Type == config.ExistingKey); + + var identity = context.User.Identity as ClaimsIdentity; + + if (exists != null) + { + identity?.RemoveClaim(exists); + } + + identity?.AddClaim(new System.Security.Claims.Claim(config.ExistingKey, value.Data)); + } + + return new OkResponse(); + } + } +} diff --git a/src/Ocelot/Claims/Middleware/ClaimsBuilderMiddlewareExtensions.cs b/src/Ocelot/Claims/Middleware/ClaimsBuilderMiddlewareExtensions.cs index 0790ec7c..a1d929ec 100644 --- a/src/Ocelot/Claims/Middleware/ClaimsBuilderMiddlewareExtensions.cs +++ b/src/Ocelot/Claims/Middleware/ClaimsBuilderMiddlewareExtensions.cs @@ -1,13 +1,13 @@ -using Microsoft.AspNetCore.Builder; -using Ocelot.Middleware.Pipeline; - -namespace Ocelot.Claims.Middleware -{ - public static class ClaimsBuilderMiddlewareExtensions - { - public static IOcelotPipelineBuilder UseClaimsBuilderMiddleware(this IOcelotPipelineBuilder builder) - { - return builder.UseMiddleware(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Ocelot.Middleware.Pipeline; + +namespace Ocelot.Claims.Middleware +{ + public static class ClaimsToClaimsMiddlewareExtensions + { + public static IOcelotPipelineBuilder UseClaimsToClaimsMiddleware(this IOcelotPipelineBuilder builder) + { + return builder.UseMiddleware(); + } + } +} diff --git a/src/Ocelot/Claims/Middleware/ClaimsBuilderMiddleware.cs b/src/Ocelot/Claims/Middleware/ClaimsToClaimsMiddleware.cs similarity index 83% rename from src/Ocelot/Claims/Middleware/ClaimsBuilderMiddleware.cs rename to src/Ocelot/Claims/Middleware/ClaimsToClaimsMiddleware.cs index 2dfc3dc0..7e1a301e 100644 --- a/src/Ocelot/Claims/Middleware/ClaimsBuilderMiddleware.cs +++ b/src/Ocelot/Claims/Middleware/ClaimsToClaimsMiddleware.cs @@ -1,45 +1,45 @@ -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; -using Ocelot.DownstreamRouteFinder.Middleware; -using Ocelot.Infrastructure.RequestData; -using Ocelot.Logging; -using Ocelot.Middleware; - -namespace Ocelot.Claims.Middleware -{ - public class ClaimsBuilderMiddleware : OcelotMiddleware - { - private readonly OcelotRequestDelegate _next; - private readonly IAddClaimsToRequest _addClaimsToRequest; - - public ClaimsBuilderMiddleware(OcelotRequestDelegate next, - IOcelotLoggerFactory loggerFactory, - IAddClaimsToRequest addClaimsToRequest) - :base(loggerFactory.CreateLogger()) - { - _next = next; - _addClaimsToRequest = addClaimsToRequest; - } - - public async Task Invoke(DownstreamContext context) - { - if (context.DownstreamReRoute.ClaimsToClaims.Any()) - { - Logger.LogDebug("this route has instructions to convert claims to other claims"); - - var result = _addClaimsToRequest.SetClaimsOnContext(context.DownstreamReRoute.ClaimsToClaims, context.HttpContext); - - if (result.IsError) - { - Logger.LogDebug("error converting claims to other claims, setting pipeline error"); - - SetPipelineError(context, result.Errors); - return; - } - } - - await _next.Invoke(context); - } - } -} +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Ocelot.DownstreamRouteFinder.Middleware; +using Ocelot.Infrastructure.RequestData; +using Ocelot.Logging; +using Ocelot.Middleware; + +namespace Ocelot.Claims.Middleware +{ + public class ClaimsToClaimsMiddleware : OcelotMiddleware + { + private readonly OcelotRequestDelegate _next; + private readonly IAddClaimsToRequest _addClaimsToRequest; + + public ClaimsToClaimsMiddleware(OcelotRequestDelegate next, + IOcelotLoggerFactory loggerFactory, + IAddClaimsToRequest addClaimsToRequest) + :base(loggerFactory.CreateLogger()) + { + _next = next; + _addClaimsToRequest = addClaimsToRequest; + } + + public async Task Invoke(DownstreamContext context) + { + if (context.DownstreamReRoute.ClaimsToClaims.Any()) + { + Logger.LogDebug("this route has instructions to convert claims to other claims"); + + var result = _addClaimsToRequest.SetClaimsOnContext(context.DownstreamReRoute.ClaimsToClaims, context.HttpContext); + + if (result.IsError) + { + Logger.LogDebug("error converting claims to other claims, setting pipeline error"); + + SetPipelineError(context, result.Errors); + return; + } + } + + await _next.Invoke(context); + } + } +} diff --git a/src/Ocelot/Headers/AddHeadersToRequest.cs b/src/Ocelot/Headers/AddHeadersToRequest.cs index 6027e9de..d24f549a 100644 --- a/src/Ocelot/Headers/AddHeadersToRequest.cs +++ b/src/Ocelot/Headers/AddHeadersToRequest.cs @@ -1,83 +1,83 @@ -namespace Ocelot.Headers -{ - using System.Collections.Generic; - using System.Linq; - using Infrastructure; - using Logging; - using Ocelot.Configuration; - using Ocelot.Infrastructure.Claims.Parser; - using Ocelot.Responses; - using Microsoft.AspNetCore.Http; - using Microsoft.Extensions.Primitives; - using Ocelot.Configuration.Creator; - using Ocelot.Middleware; - using Ocelot.Request.Middleware; - - public class AddHeadersToRequest : IAddHeadersToRequest - { - private readonly IClaimsParser _claimsParser; - private readonly IPlaceholders _placeholders; - private readonly IOcelotLogger _logger; - - public AddHeadersToRequest(IClaimsParser claimsParser, IPlaceholders placeholders, IOcelotLoggerFactory factory) - { - _logger = factory.CreateLogger(); - _claimsParser = claimsParser; - _placeholders = placeholders; - } - - public Response SetHeadersOnDownstreamRequest(List claimsToThings, IEnumerable claims, DownstreamRequest downstreamRequest) - { - foreach (var config in claimsToThings) - { - var value = _claimsParser.GetValue(claims, config.NewKey, config.Delimiter, config.Index); - - if (value.IsError) - { - return new ErrorResponse(value.Errors); - } - - var exists = downstreamRequest.Headers.FirstOrDefault(x => x.Key == config.ExistingKey); - - if (!string.IsNullOrEmpty(exists.Key)) - { - downstreamRequest.Headers.Remove(exists.Key); - } - - downstreamRequest.Headers.Add(config.ExistingKey, value.Data); - } - - return new OkResponse(); - } - - public void SetHeadersOnDownstreamRequest(IEnumerable headers, HttpContext context) - { - var requestHeader = context.Request.Headers; - - foreach (var header in headers) - { - if (requestHeader.ContainsKey(header.Key)) - { - requestHeader.Remove(header.Key); - } - - if (header.Value.StartsWith("{") && header.Value.EndsWith("}")) - { - var value = _placeholders.Get(header.Value); - - if (value.IsError) - { - _logger.LogWarning($"Unable to add header to response {header.Key}: {header.Value}"); - continue; - } - - requestHeader.Add(header.Key, new StringValues(value.Data)); - } - else - { - requestHeader.Add(header.Key, header.Value); - } - } - } - } -} +namespace Ocelot.Headers +{ + using System.Collections.Generic; + using System.Linq; + using Infrastructure; + using Logging; + using Ocelot.Configuration; + using Ocelot.Infrastructure.Claims.Parser; + using Ocelot.Responses; + using Microsoft.AspNetCore.Http; + using Microsoft.Extensions.Primitives; + using Ocelot.Configuration.Creator; + using Ocelot.Middleware; + using Ocelot.Request.Middleware; + + public class AddHeadersToRequest : IAddHeadersToRequest + { + private readonly IClaimsParser _claimsParser; + private readonly IPlaceholders _placeholders; + private readonly IOcelotLogger _logger; + + public AddHeadersToRequest(IClaimsParser claimsParser, IPlaceholders placeholders, IOcelotLoggerFactory factory) + { + _logger = factory.CreateLogger(); + _claimsParser = claimsParser; + _placeholders = placeholders; + } + + public Response SetHeadersOnDownstreamRequest(List claimsToThings, IEnumerable claims, DownstreamRequest downstreamRequest) + { + foreach (var config in claimsToThings) + { + var value = _claimsParser.GetValue(claims, config.NewKey, config.Delimiter, config.Index); + + if (value.IsError) + { + return new ErrorResponse(value.Errors); + } + + var exists = downstreamRequest.Headers.FirstOrDefault(x => x.Key == config.ExistingKey); + + if (!string.IsNullOrEmpty(exists.Key)) + { + downstreamRequest.Headers.Remove(exists.Key); + } + + downstreamRequest.Headers.Add(config.ExistingKey, value.Data); + } + + return new OkResponse(); + } + + public void SetHeadersOnDownstreamRequest(IEnumerable headers, HttpContext context) + { + var requestHeader = context.Request.Headers; + + foreach (var header in headers) + { + if (requestHeader.ContainsKey(header.Key)) + { + requestHeader.Remove(header.Key); + } + + if (header.Value.StartsWith("{") && header.Value.EndsWith("}")) + { + var value = _placeholders.Get(header.Value); + + if (value.IsError) + { + _logger.LogWarning($"Unable to add header to response {header.Key}: {header.Value}"); + continue; + } + + requestHeader.Add(header.Key, new StringValues(value.Data)); + } + else + { + requestHeader.Add(header.Key, header.Value); + } + } + } + } +} diff --git a/src/Ocelot/Headers/HttpContextRequestHeaderReplacer.cs b/src/Ocelot/Headers/HttpContextRequestHeaderReplacer.cs index 02779ca6..2323258a 100644 --- a/src/Ocelot/Headers/HttpContextRequestHeaderReplacer.cs +++ b/src/Ocelot/Headers/HttpContextRequestHeaderReplacer.cs @@ -1,25 +1,25 @@ -using System.Collections.Generic; -using Microsoft.AspNetCore.Http; -using Ocelot.Configuration; -using Ocelot.Responses; - -namespace Ocelot.Headers -{ - public class HttpContextRequestHeaderReplacer : IHttpContextRequestHeaderReplacer - { - public Response Replace(HttpContext context, List fAndRs) - { - foreach (var f in fAndRs) - { - if(context.Request.Headers.TryGetValue(f.Key, out var values)) - { - var replaced = values[f.Index].Replace(f.Find, f.Replace); - context.Request.Headers.Remove(f.Key); - context.Request.Headers.Add(f.Key, replaced); - } - } - - return new OkResponse(); - } - } -} \ No newline at end of file +using System.Collections.Generic; +using Microsoft.AspNetCore.Http; +using Ocelot.Configuration; +using Ocelot.Responses; + +namespace Ocelot.Headers +{ + public class HttpContextRequestHeaderReplacer : IHttpContextRequestHeaderReplacer + { + public Response Replace(HttpContext context, List fAndRs) + { + foreach (var f in fAndRs) + { + if(context.Request.Headers.TryGetValue(f.Key, out var values)) + { + var replaced = values[f.Index].Replace(f.Find, f.Replace); + context.Request.Headers.Remove(f.Key); + context.Request.Headers.Add(f.Key, replaced); + } + } + + return new OkResponse(); + } + } +} diff --git a/src/Ocelot/Headers/Middleware/HttpRequestHeadersBuilderMiddleware.cs b/src/Ocelot/Headers/Middleware/ClaimsToHeadersMiddleware.cs similarity index 83% rename from src/Ocelot/Headers/Middleware/HttpRequestHeadersBuilderMiddleware.cs rename to src/Ocelot/Headers/Middleware/ClaimsToHeadersMiddleware.cs index ba340b3a..1faf4fa6 100644 --- a/src/Ocelot/Headers/Middleware/HttpRequestHeadersBuilderMiddleware.cs +++ b/src/Ocelot/Headers/Middleware/ClaimsToHeadersMiddleware.cs @@ -1,47 +1,47 @@ -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; -using Ocelot.DownstreamRouteFinder.Middleware; -using Ocelot.Infrastructure.RequestData; -using Ocelot.Logging; -using Ocelot.Middleware; - -namespace Ocelot.Headers.Middleware -{ - public class HttpRequestHeadersBuilderMiddleware : OcelotMiddleware - { - private readonly OcelotRequestDelegate _next; - private readonly IAddHeadersToRequest _addHeadersToRequest; - - public HttpRequestHeadersBuilderMiddleware(OcelotRequestDelegate next, - IOcelotLoggerFactory loggerFactory, - IAddHeadersToRequest addHeadersToRequest) - :base(loggerFactory.CreateLogger()) - { - _next = next; - _addHeadersToRequest = addHeadersToRequest; - } - - public async Task Invoke(DownstreamContext context) - { - if (context.DownstreamReRoute.ClaimsToHeaders.Any()) - { - Logger.LogInformation($"{context.DownstreamReRoute.DownstreamPathTemplate.Value} has instructions to convert claims to headers"); - - var response = _addHeadersToRequest.SetHeadersOnDownstreamRequest(context.DownstreamReRoute.ClaimsToHeaders, context.HttpContext.User.Claims, context.DownstreamRequest); - - if (response.IsError) - { - Logger.LogWarning("Error setting headers on context, setting pipeline error"); - - SetPipelineError(context, response.Errors); - return; - } - - Logger.LogInformation("headers have been set on context"); - } - - await _next.Invoke(context); - } - } -} +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Ocelot.DownstreamRouteFinder.Middleware; +using Ocelot.Infrastructure.RequestData; +using Ocelot.Logging; +using Ocelot.Middleware; + +namespace Ocelot.Headers.Middleware +{ + public class ClaimsToHeadersMiddleware : OcelotMiddleware + { + private readonly OcelotRequestDelegate _next; + private readonly IAddHeadersToRequest _addHeadersToRequest; + + public ClaimsToHeadersMiddleware(OcelotRequestDelegate next, + IOcelotLoggerFactory loggerFactory, + IAddHeadersToRequest addHeadersToRequest) + :base(loggerFactory.CreateLogger()) + { + _next = next; + _addHeadersToRequest = addHeadersToRequest; + } + + public async Task Invoke(DownstreamContext context) + { + if (context.DownstreamReRoute.ClaimsToHeaders.Any()) + { + Logger.LogInformation($"{context.DownstreamReRoute.DownstreamPathTemplate.Value} has instructions to convert claims to headers"); + + var response = _addHeadersToRequest.SetHeadersOnDownstreamRequest(context.DownstreamReRoute.ClaimsToHeaders, context.HttpContext.User.Claims, context.DownstreamRequest); + + if (response.IsError) + { + Logger.LogWarning("Error setting headers on context, setting pipeline error"); + + SetPipelineError(context, response.Errors); + return; + } + + Logger.LogInformation("headers have been set on context"); + } + + await _next.Invoke(context); + } + } +} diff --git a/src/Ocelot/Headers/Middleware/ClaimsToHeadersMiddlewareExtensions.cs b/src/Ocelot/Headers/Middleware/ClaimsToHeadersMiddlewareExtensions.cs new file mode 100644 index 00000000..91a5fe90 --- /dev/null +++ b/src/Ocelot/Headers/Middleware/ClaimsToHeadersMiddlewareExtensions.cs @@ -0,0 +1,13 @@ +using Microsoft.AspNetCore.Builder; +using Ocelot.Middleware.Pipeline; + +namespace Ocelot.Headers.Middleware +{ + public static class ClaimsToHeadersMiddlewareExtensions + { + public static IOcelotPipelineBuilder UseClaimsToHeadersMiddleware(this IOcelotPipelineBuilder builder) + { + return builder.UseMiddleware(); + } + } +} diff --git a/src/Ocelot/Headers/Middleware/HttpRequestHeadersBuilderMiddlewareExtensions.cs b/src/Ocelot/Headers/Middleware/HttpRequestHeadersBuilderMiddlewareExtensions.cs deleted file mode 100644 index 69f23860..00000000 --- a/src/Ocelot/Headers/Middleware/HttpRequestHeadersBuilderMiddlewareExtensions.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Ocelot.Middleware.Pipeline; - -namespace Ocelot.Headers.Middleware -{ - public static class HttpRequestHeadersBuilderMiddlewareExtensions - { - public static IOcelotPipelineBuilder UseHttpRequestHeadersBuilderMiddleware(this IOcelotPipelineBuilder builder) - { - return builder.UseMiddleware(); - } - } -} diff --git a/src/Ocelot/Middleware/Pipeline/OcelotPipelineExtensions.cs b/src/Ocelot/Middleware/Pipeline/OcelotPipelineExtensions.cs index 67865b68..a35dc41f 100644 --- a/src/Ocelot/Middleware/Pipeline/OcelotPipelineExtensions.cs +++ b/src/Ocelot/Middleware/Pipeline/OcelotPipelineExtensions.cs @@ -91,7 +91,7 @@ namespace Ocelot.Middleware.Pipeline } // The next thing we do is look at any claims transforms in case this is important for authorisation - builder.UseClaimsBuilderMiddleware(); + builder.UseClaimsToClaimsMiddleware(); // Allow pre authorisation logic. The idea being people might want to run something custom before what is built in. builder.UseIfNotNull(pipelineConfiguration.PreAuthorisationMiddleware); @@ -109,14 +109,14 @@ namespace Ocelot.Middleware.Pipeline builder.Use(pipelineConfiguration.AuthorisationMiddleware); } - // Now we can run any header transformation logic - builder.UseHttpRequestHeadersBuilderMiddleware(); + // Now we can run the claims to headers transformation middleware + builder.UseClaimsToHeadersMiddleware(); // Allow the user to implement their own query string manipulation logic builder.UseIfNotNull(pipelineConfiguration.PreQueryStringBuilderMiddleware); - // Now we can run any query string transformation logic - builder.UseQueryStringBuilderMiddleware(); + // Now we can run any claims to query string transformation middleware + builder.UseClaimsToQueryStringMiddleware(); // Get the load balancer for this request builder.UseLoadBalancingMiddleware(); diff --git a/src/Ocelot/QueryStrings/Middleware/QueryStringBuilderMiddleware.cs b/src/Ocelot/QueryStrings/Middleware/ClaimsToQueryStringMiddleware.cs similarity index 69% rename from src/Ocelot/QueryStrings/Middleware/QueryStringBuilderMiddleware.cs rename to src/Ocelot/QueryStrings/Middleware/ClaimsToQueryStringMiddleware.cs index bc886c5d..6af29464 100644 --- a/src/Ocelot/QueryStrings/Middleware/QueryStringBuilderMiddleware.cs +++ b/src/Ocelot/QueryStrings/Middleware/ClaimsToQueryStringMiddleware.cs @@ -1,45 +1,45 @@ -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; -using Ocelot.DownstreamRouteFinder.Middleware; -using Ocelot.Infrastructure.RequestData; -using Ocelot.Logging; -using Ocelot.Middleware; - -namespace Ocelot.QueryStrings.Middleware -{ - public class QueryStringBuilderMiddleware : OcelotMiddleware - { - private readonly OcelotRequestDelegate _next; - private readonly IAddQueriesToRequest _addQueriesToRequest; - - public QueryStringBuilderMiddleware(OcelotRequestDelegate next, - IOcelotLoggerFactory loggerFactory, - IAddQueriesToRequest addQueriesToRequest) - : base(loggerFactory.CreateLogger()) - { - _next = next; - _addQueriesToRequest = addQueriesToRequest; - } - - public async Task Invoke(DownstreamContext context) - { - if (context.DownstreamReRoute.ClaimsToQueries.Any()) - { - Logger.LogInformation($"{context.DownstreamReRoute.DownstreamPathTemplate.Value} has instructions to convert claims to queries"); - - var response = _addQueriesToRequest.SetQueriesOnDownstreamRequest(context.DownstreamReRoute.ClaimsToQueries, context.HttpContext.User.Claims, context.DownstreamRequest); - - if (response.IsError) - { - Logger.LogWarning("there was an error setting queries on context, setting pipeline error"); - - SetPipelineError(context, response.Errors); - return; - } - } - - await _next.Invoke(context); - } - } -} +namespace Ocelot.QueryStrings.Middleware +{ + using System.Linq; + using System.Threading.Tasks; + using Microsoft.AspNetCore.Http; + using Ocelot.DownstreamRouteFinder.Middleware; + using Ocelot.Infrastructure.RequestData; + using Ocelot.Logging; + using Ocelot.Middleware; + + public class ClaimsToQueryStringMiddleware : OcelotMiddleware + { + private readonly OcelotRequestDelegate _next; + private readonly IAddQueriesToRequest _addQueriesToRequest; + + public ClaimsToQueryStringMiddleware(OcelotRequestDelegate next, + IOcelotLoggerFactory loggerFactory, + IAddQueriesToRequest addQueriesToRequest) + : base(loggerFactory.CreateLogger()) + { + _next = next; + _addQueriesToRequest = addQueriesToRequest; + } + + public async Task Invoke(DownstreamContext context) + { + if (context.DownstreamReRoute.ClaimsToQueries.Any()) + { + Logger.LogInformation($"{context.DownstreamReRoute.DownstreamPathTemplate.Value} has instructions to convert claims to queries"); + + var response = _addQueriesToRequest.SetQueriesOnDownstreamRequest(context.DownstreamReRoute.ClaimsToQueries, context.HttpContext.User.Claims, context.DownstreamRequest); + + if (response.IsError) + { + Logger.LogWarning("there was an error setting queries on context, setting pipeline error"); + + SetPipelineError(context, response.Errors); + return; + } + } + + await _next.Invoke(context); + } + } +} diff --git a/src/Ocelot/QueryStrings/Middleware/ClaimsToQueryStringMiddlewareExtensions.cs b/src/Ocelot/QueryStrings/Middleware/ClaimsToQueryStringMiddlewareExtensions.cs new file mode 100644 index 00000000..e54dd976 --- /dev/null +++ b/src/Ocelot/QueryStrings/Middleware/ClaimsToQueryStringMiddlewareExtensions.cs @@ -0,0 +1,13 @@ +namespace Ocelot.QueryStrings.Middleware +{ + using Microsoft.AspNetCore.Builder; + using Ocelot.Middleware.Pipeline; + + public static class ClaimsToQueryStringMiddlewareExtensions + { + public static IOcelotPipelineBuilder UseClaimsToQueryStringMiddleware(this IOcelotPipelineBuilder builder) + { + return builder.UseMiddleware(); + } + } +} diff --git a/src/Ocelot/QueryStrings/Middleware/QueryStringBuilderMiddlewareExtensions.cs b/src/Ocelot/QueryStrings/Middleware/QueryStringBuilderMiddlewareExtensions.cs deleted file mode 100644 index 0a32f727..00000000 --- a/src/Ocelot/QueryStrings/Middleware/QueryStringBuilderMiddlewareExtensions.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Ocelot.Middleware.Pipeline; - -namespace Ocelot.QueryStrings.Middleware -{ - public static class QueryStringBuilderMiddlewareExtensions - { - public static IOcelotPipelineBuilder UseQueryStringBuilderMiddleware(this IOcelotPipelineBuilder builder) - { - return builder.UseMiddleware(); - } - } -} diff --git a/test/Ocelot.Benchmarks/DownstreamRouteFinderMiddlewareBenchmarks.cs b/test/Ocelot.Benchmarks/DownstreamRouteFinderMiddlewareBenchmarks.cs new file mode 100644 index 00000000..b3b72f9b --- /dev/null +++ b/test/Ocelot.Benchmarks/DownstreamRouteFinderMiddlewareBenchmarks.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.IO; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Columns; +using BenchmarkDotNet.Configs; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Ocelot.Configuration.File; +using Ocelot.DownstreamRouteFinder.UrlMatcher; +using Ocelot.Middleware; +using Ocelot.DependencyInjection; +using System.Net.Http; +using System.Threading.Tasks; +using BenchmarkDotNet.Attributes.Jobs; +using Ocelot.Configuration.Repository; +using Ocelot.Infrastructure.RequestData; +using Ocelot.Logging; +using Ocelot.Errors.Middleware; +using Microsoft.Extensions.DependencyInjection; +using BenchmarkDotNet.Diagnosers; +using BenchmarkDotNet.Validators; +using Ocelot.DownstreamRouteFinder.Middleware; +using Ocelot.DownstreamRouteFinder.Finder; +using Ocelot.Middleware.Multiplexer; + +namespace Ocelot.Benchmarks +{ + [SimpleJob(launchCount: 1, warmupCount: 2, targetCount: 5)] + [Config(typeof(DownstreamRouteFinderMiddlewareBenchmarks))] + public class DownstreamRouteFinderMiddlewareBenchmarks : ManualConfig + { + private DownstreamRouteFinderMiddleware _middleware; + private DownstreamContext _downstreamContext; + private OcelotRequestDelegate _next; + + public DownstreamRouteFinderMiddlewareBenchmarks() + { + Add(StatisticColumn.AllStatistics); + Add(MemoryDiagnoser.Default); + Add(BaselineValidator.FailOnError); + } + + [GlobalSetup] + public void SetUp() + { + var serviceCollection = new ServiceCollection(); + var config = new ConfigurationRoot(new List()); + var builder = new OcelotBuilder(serviceCollection, config); + var services = serviceCollection.BuildServiceProvider(); + var loggerFactory = services.GetService(); + var drpf = services.GetService(); + var icr = services.GetService(); + var multiplexer = services.GetService(); + + _next = async context => { + await Task.CompletedTask; + throw new Exception("BOOM"); + }; + + _middleware = new DownstreamRouteFinderMiddleware(_next, loggerFactory, drpf, icr, multiplexer); + _downstreamContext = new DownstreamContext(new DefaultHttpContext()); + } + + [Benchmark(Baseline = true)] + public async Task Baseline() + { + await _middleware.Invoke(_downstreamContext); + } + } +} diff --git a/test/Ocelot.UnitTests/Claims/ClaimsBuilderMiddlewareTests.cs b/test/Ocelot.UnitTests/Claims/ClaimsToClaimsMiddlewareTests.cs similarity index 87% rename from test/Ocelot.UnitTests/Claims/ClaimsBuilderMiddlewareTests.cs rename to test/Ocelot.UnitTests/Claims/ClaimsToClaimsMiddlewareTests.cs index 02e9d8fc..5d96884f 100644 --- a/test/Ocelot.UnitTests/Claims/ClaimsBuilderMiddlewareTests.cs +++ b/test/Ocelot.UnitTests/Claims/ClaimsToClaimsMiddlewareTests.cs @@ -1,89 +1,89 @@ -using Ocelot.Middleware; - -namespace Ocelot.UnitTests.Claims -{ - using System.Collections.Generic; - using System.Threading.Tasks; - using Microsoft.AspNetCore.Http; - using Moq; - using Ocelot.Claims; - using Ocelot.Claims.Middleware; - using Ocelot.Configuration; - using Ocelot.Configuration.Builder; - using Ocelot.DownstreamRouteFinder; - using Ocelot.DownstreamRouteFinder.UrlMatcher; - using Ocelot.Logging; - using Ocelot.Responses; - using TestStack.BDDfy; - using Xunit; - - public class ClaimsBuilderMiddlewareTests - { - private readonly Mock _addHeaders; - private Mock _loggerFactory; - private Mock _logger; - private readonly ClaimsBuilderMiddleware _middleware; - private readonly DownstreamContext _downstreamContext; - private OcelotRequestDelegate _next; - - public ClaimsBuilderMiddlewareTests() - { - _addHeaders = new Mock(); - _downstreamContext = new DownstreamContext(new DefaultHttpContext()); - _loggerFactory = new Mock(); - _logger = new Mock(); - _loggerFactory.Setup(x => x.CreateLogger()).Returns(_logger.Object); - _next = context => Task.CompletedTask; - _middleware = new ClaimsBuilderMiddleware(_next, _loggerFactory.Object, _addHeaders.Object); - } - - [Fact] - public void should_call_claims_to_request_correctly() - { - var downstreamRoute = new DownstreamRoute(new List(), - new ReRouteBuilder() - .WithDownstreamReRoute(new DownstreamReRouteBuilder() - .WithDownstreamPathTemplate("any old string") - .WithClaimsToClaims(new List - { - new ClaimToThing("sub", "UserType", "|", 0) - }) - .WithUpstreamHttpMethod(new List { "Get" }) - .Build()) - .WithUpstreamHttpMethod(new List { "Get" }) - .Build()); - - this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute)) - .And(x => x.GivenTheAddClaimsToRequestReturns()) - .When(x => x.WhenICallTheMiddleware()) - .Then(x => x.ThenTheClaimsToRequestIsCalledCorrectly()) - .BDDfy(); - } - - private void WhenICallTheMiddleware() - { - _middleware.Invoke(_downstreamContext).GetAwaiter().GetResult(); - } - - private void GivenTheDownStreamRouteIs(DownstreamRoute downstreamRoute) - { - _downstreamContext.TemplatePlaceholderNameAndValues = downstreamRoute.TemplatePlaceholderNameAndValues; - _downstreamContext.DownstreamReRoute = downstreamRoute.ReRoute.DownstreamReRoute[0]; - } - - private void GivenTheAddClaimsToRequestReturns() - { - _addHeaders - .Setup(x => x.SetClaimsOnContext(It.IsAny>(), - It.IsAny())) - .Returns(new OkResponse()); - } - - private void ThenTheClaimsToRequestIsCalledCorrectly() - { - _addHeaders - .Verify(x => x.SetClaimsOnContext(It.IsAny>(), - It.IsAny()), Times.Once); - } - } -} +using Ocelot.Middleware; + +namespace Ocelot.UnitTests.Claims +{ + using System.Collections.Generic; + using System.Threading.Tasks; + using Microsoft.AspNetCore.Http; + using Moq; + using Ocelot.Claims; + using Ocelot.Claims.Middleware; + using Ocelot.Configuration; + using Ocelot.Configuration.Builder; + using Ocelot.DownstreamRouteFinder; + using Ocelot.DownstreamRouteFinder.UrlMatcher; + using Ocelot.Logging; + using Ocelot.Responses; + using TestStack.BDDfy; + using Xunit; + + public class ClaimsToClaimsMiddlewareTests + { + private readonly Mock _addHeaders; + private Mock _loggerFactory; + private Mock _logger; + private readonly ClaimsToClaimsMiddleware _middleware; + private readonly DownstreamContext _downstreamContext; + private OcelotRequestDelegate _next; + + public ClaimsToClaimsMiddlewareTests() + { + _addHeaders = new Mock(); + _downstreamContext = new DownstreamContext(new DefaultHttpContext()); + _loggerFactory = new Mock(); + _logger = new Mock(); + _loggerFactory.Setup(x => x.CreateLogger()).Returns(_logger.Object); + _next = context => Task.CompletedTask; + _middleware = new ClaimsToClaimsMiddleware(_next, _loggerFactory.Object, _addHeaders.Object); + } + + [Fact] + public void should_call_claims_to_request_correctly() + { + var downstreamRoute = new DownstreamRoute(new List(), + new ReRouteBuilder() + .WithDownstreamReRoute(new DownstreamReRouteBuilder() + .WithDownstreamPathTemplate("any old string") + .WithClaimsToClaims(new List + { + new ClaimToThing("sub", "UserType", "|", 0) + }) + .WithUpstreamHttpMethod(new List { "Get" }) + .Build()) + .WithUpstreamHttpMethod(new List { "Get" }) + .Build()); + + this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute)) + .And(x => x.GivenTheAddClaimsToRequestReturns()) + .When(x => x.WhenICallTheMiddleware()) + .Then(x => x.ThenTheClaimsToRequestIsCalledCorrectly()) + .BDDfy(); + } + + private void WhenICallTheMiddleware() + { + _middleware.Invoke(_downstreamContext).GetAwaiter().GetResult(); + } + + private void GivenTheDownStreamRouteIs(DownstreamRoute downstreamRoute) + { + _downstreamContext.TemplatePlaceholderNameAndValues = downstreamRoute.TemplatePlaceholderNameAndValues; + _downstreamContext.DownstreamReRoute = downstreamRoute.ReRoute.DownstreamReRoute[0]; + } + + private void GivenTheAddClaimsToRequestReturns() + { + _addHeaders + .Setup(x => x.SetClaimsOnContext(It.IsAny>(), + It.IsAny())) + .Returns(new OkResponse()); + } + + private void ThenTheClaimsToRequestIsCalledCorrectly() + { + _addHeaders + .Verify(x => x.SetClaimsOnContext(It.IsAny>(), + It.IsAny()), Times.Once); + } + } +} diff --git a/test/Ocelot.UnitTests/Headers/HttpRequestHeadersBuilderMiddlewareTests.cs b/test/Ocelot.UnitTests/Headers/ClaimsToHeadersMiddlewareTests.cs similarity index 88% rename from test/Ocelot.UnitTests/Headers/HttpRequestHeadersBuilderMiddlewareTests.cs rename to test/Ocelot.UnitTests/Headers/ClaimsToHeadersMiddlewareTests.cs index 7a448118..6931f15d 100644 --- a/test/Ocelot.UnitTests/Headers/HttpRequestHeadersBuilderMiddlewareTests.cs +++ b/test/Ocelot.UnitTests/Headers/ClaimsToHeadersMiddlewareTests.cs @@ -1,98 +1,98 @@ -using Ocelot.Middleware; - -namespace Ocelot.UnitTests.Headers -{ - using System.Collections.Generic; - using System.Net.Http; - using System.Threading.Tasks; - using Microsoft.AspNetCore.Http; - using Moq; - using Ocelot.Configuration; - using Ocelot.Configuration.Builder; - using Ocelot.DownstreamRouteFinder; - using Ocelot.DownstreamRouteFinder.UrlMatcher; - using Ocelot.Headers; - using Ocelot.Headers.Middleware; - using Ocelot.Logging; - using Ocelot.Request.Middleware; - using Ocelot.Responses; - using TestStack.BDDfy; - using Xunit; - - public class HttpRequestHeadersBuilderMiddlewareTests - { - private readonly Mock _addHeaders; - private Response _downstreamRoute; - private Mock _loggerFactory; - private Mock _logger; - private HttpRequestHeadersBuilderMiddleware _middleware; - private DownstreamContext _downstreamContext; - private OcelotRequestDelegate _next; - - public HttpRequestHeadersBuilderMiddlewareTests() - { - _addHeaders = new Mock(); - _downstreamContext = new DownstreamContext(new DefaultHttpContext()); - _loggerFactory = new Mock(); - _logger = new Mock(); - _loggerFactory.Setup(x => x.CreateLogger()).Returns(_logger.Object); - _next = context => Task.CompletedTask; - _middleware = new HttpRequestHeadersBuilderMiddleware(_next, _loggerFactory.Object, _addHeaders.Object); - _downstreamContext.DownstreamRequest = new DownstreamRequest(new HttpRequestMessage(HttpMethod.Get, "http://test.com")); - } - - [Fact] - public void should_call_add_headers_to_request_correctly() - { - var downstreamRoute = new DownstreamRoute(new List(), - new ReRouteBuilder() - .WithDownstreamReRoute(new DownstreamReRouteBuilder() - .WithDownstreamPathTemplate("any old string") - .WithClaimsToHeaders(new List - { - new ClaimToThing("UserId", "Subject", "", 0) - }) - .WithUpstreamHttpMethod(new List { "Get" }) - .Build()) - .WithUpstreamHttpMethod(new List { "Get" }) - .Build()); - - this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute)) - .And(x => x.GivenTheAddHeadersToDownstreamRequestReturnsOk()) - .When(x => x.WhenICallTheMiddleware()) - .Then(x => x.ThenTheAddHeadersToRequestIsCalledCorrectly()) - .BDDfy(); - } - - private void WhenICallTheMiddleware() - { - _middleware.Invoke(_downstreamContext).GetAwaiter().GetResult(); - } - - private void GivenTheDownStreamRouteIs(DownstreamRoute downstreamRoute) - { - _downstreamRoute = new OkResponse(downstreamRoute); - _downstreamContext.TemplatePlaceholderNameAndValues = downstreamRoute.TemplatePlaceholderNameAndValues; - _downstreamContext.DownstreamReRoute = downstreamRoute.ReRoute.DownstreamReRoute[0]; - } - - private void GivenTheAddHeadersToDownstreamRequestReturnsOk() - { - _addHeaders - .Setup(x => x.SetHeadersOnDownstreamRequest( - It.IsAny>(), - It.IsAny>(), - It.IsAny())) - .Returns(new OkResponse()); - } - - private void ThenTheAddHeadersToRequestIsCalledCorrectly() - { - _addHeaders - .Verify(x => x.SetHeadersOnDownstreamRequest( - It.IsAny>(), - It.IsAny>(), - _downstreamContext.DownstreamRequest), Times.Once); - } - } -} +using Ocelot.Middleware; + +namespace Ocelot.UnitTests.Headers +{ + using System.Collections.Generic; + using System.Net.Http; + using System.Threading.Tasks; + using Microsoft.AspNetCore.Http; + using Moq; + using Ocelot.Configuration; + using Ocelot.Configuration.Builder; + using Ocelot.DownstreamRouteFinder; + using Ocelot.DownstreamRouteFinder.UrlMatcher; + using Ocelot.Headers; + using Ocelot.Headers.Middleware; + using Ocelot.Logging; + using Ocelot.Request.Middleware; + using Ocelot.Responses; + using TestStack.BDDfy; + using Xunit; + + public class ClaimsToHeadersMiddlewareTests + { + private readonly Mock _addHeaders; + private Response _downstreamRoute; + private Mock _loggerFactory; + private Mock _logger; + private ClaimsToHeadersMiddleware _middleware; + private DownstreamContext _downstreamContext; + private OcelotRequestDelegate _next; + + public ClaimsToHeadersMiddlewareTests() + { + _addHeaders = new Mock(); + _downstreamContext = new DownstreamContext(new DefaultHttpContext()); + _loggerFactory = new Mock(); + _logger = new Mock(); + _loggerFactory.Setup(x => x.CreateLogger()).Returns(_logger.Object); + _next = context => Task.CompletedTask; + _middleware = new ClaimsToHeadersMiddleware(_next, _loggerFactory.Object, _addHeaders.Object); + _downstreamContext.DownstreamRequest = new DownstreamRequest(new HttpRequestMessage(HttpMethod.Get, "http://test.com")); + } + + [Fact] + public void should_call_add_headers_to_request_correctly() + { + var downstreamRoute = new DownstreamRoute(new List(), + new ReRouteBuilder() + .WithDownstreamReRoute(new DownstreamReRouteBuilder() + .WithDownstreamPathTemplate("any old string") + .WithClaimsToHeaders(new List + { + new ClaimToThing("UserId", "Subject", "", 0) + }) + .WithUpstreamHttpMethod(new List { "Get" }) + .Build()) + .WithUpstreamHttpMethod(new List { "Get" }) + .Build()); + + this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute)) + .And(x => x.GivenTheAddHeadersToDownstreamRequestReturnsOk()) + .When(x => x.WhenICallTheMiddleware()) + .Then(x => x.ThenTheAddHeadersToRequestIsCalledCorrectly()) + .BDDfy(); + } + + private void WhenICallTheMiddleware() + { + _middleware.Invoke(_downstreamContext).GetAwaiter().GetResult(); + } + + private void GivenTheDownStreamRouteIs(DownstreamRoute downstreamRoute) + { + _downstreamRoute = new OkResponse(downstreamRoute); + _downstreamContext.TemplatePlaceholderNameAndValues = downstreamRoute.TemplatePlaceholderNameAndValues; + _downstreamContext.DownstreamReRoute = downstreamRoute.ReRoute.DownstreamReRoute[0]; + } + + private void GivenTheAddHeadersToDownstreamRequestReturnsOk() + { + _addHeaders + .Setup(x => x.SetHeadersOnDownstreamRequest( + It.IsAny>(), + It.IsAny>(), + It.IsAny())) + .Returns(new OkResponse()); + } + + private void ThenTheAddHeadersToRequestIsCalledCorrectly() + { + _addHeaders + .Verify(x => x.SetHeadersOnDownstreamRequest( + It.IsAny>(), + It.IsAny>(), + _downstreamContext.DownstreamRequest), Times.Once); + } + } +} diff --git a/test/Ocelot.UnitTests/QueryStrings/QueryStringBuilderMiddlewareTests.cs b/test/Ocelot.UnitTests/QueryStrings/ClaimsToQueryStringMiddlewareTests.cs similarity index 88% rename from test/Ocelot.UnitTests/QueryStrings/QueryStringBuilderMiddlewareTests.cs rename to test/Ocelot.UnitTests/QueryStrings/ClaimsToQueryStringMiddlewareTests.cs index e4d95028..2710c866 100644 --- a/test/Ocelot.UnitTests/QueryStrings/QueryStringBuilderMiddlewareTests.cs +++ b/test/Ocelot.UnitTests/QueryStrings/ClaimsToQueryStringMiddlewareTests.cs @@ -1,97 +1,97 @@ -using Ocelot.Middleware; - -namespace Ocelot.UnitTests.QueryStrings -{ - using System.Collections.Generic; - using System.Net.Http; - using Moq; - using Ocelot.Configuration; - using Ocelot.Configuration.Builder; - using Ocelot.DownstreamRouteFinder; - using Ocelot.DownstreamRouteFinder.UrlMatcher; - using Ocelot.Logging; - using Ocelot.QueryStrings; - using Ocelot.QueryStrings.Middleware; - using Ocelot.Responses; - using TestStack.BDDfy; - using Xunit; - using System.Security.Claims; - using Microsoft.AspNetCore.Http; - using System.Threading.Tasks; - using Ocelot.Request.Middleware; - - public class QueryStringBuilderMiddlewareTests - { - private readonly Mock _addQueries; - private Mock _loggerFactory; - private Mock _logger; - private QueryStringBuilderMiddleware _middleware; - private DownstreamContext _downstreamContext; - private OcelotRequestDelegate _next; - - public QueryStringBuilderMiddlewareTests() - { - _downstreamContext = new DownstreamContext(new DefaultHttpContext()); - _loggerFactory = new Mock(); - _logger = new Mock(); - _loggerFactory.Setup(x => x.CreateLogger()).Returns(_logger.Object); - _next = context => Task.CompletedTask; - _addQueries = new Mock(); - _downstreamContext.DownstreamRequest = new DownstreamRequest(new HttpRequestMessage(HttpMethod.Get, "http://test.com")); - _middleware = new QueryStringBuilderMiddleware(_next, _loggerFactory.Object, _addQueries.Object); - } - - [Fact] - public void should_call_add_queries_correctly() - { - var downstreamRoute = new DownstreamRoute(new List(), - new ReRouteBuilder() - .WithDownstreamReRoute(new DownstreamReRouteBuilder() - .WithDownstreamPathTemplate("any old string") - .WithClaimsToQueries(new List - { - new ClaimToThing("UserId", "Subject", "", 0) - }) - .WithUpstreamHttpMethod(new List { "Get" }) - .Build()) - .WithUpstreamHttpMethod(new List { "Get" }) - .Build()); - - this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute)) - .And(x => x.GivenTheAddHeadersToRequestReturnsOk()) - .When(x => x.WhenICallTheMiddleware()) - .Then(x => x.ThenTheAddQueriesToRequestIsCalledCorrectly()) - .BDDfy(); - } - - private void WhenICallTheMiddleware() - { - _middleware.Invoke(_downstreamContext).GetAwaiter().GetResult(); - } - - private void GivenTheAddHeadersToRequestReturnsOk() - { - _addQueries - .Setup(x => x.SetQueriesOnDownstreamRequest( - It.IsAny>(), - It.IsAny>(), - It.IsAny())) - .Returns(new OkResponse()); - } - - private void ThenTheAddQueriesToRequestIsCalledCorrectly() - { - _addQueries - .Verify(x => x.SetQueriesOnDownstreamRequest( - It.IsAny>(), - It.IsAny>(), - _downstreamContext.DownstreamRequest), Times.Once); - } - - private void GivenTheDownStreamRouteIs(DownstreamRoute downstreamRoute) - { - _downstreamContext.TemplatePlaceholderNameAndValues = downstreamRoute.TemplatePlaceholderNameAndValues; - _downstreamContext.DownstreamReRoute = downstreamRoute.ReRoute.DownstreamReRoute[0]; - } - } -} +using Ocelot.Middleware; + +namespace Ocelot.UnitTests.QueryStrings +{ + using System.Collections.Generic; + using System.Net.Http; + using Moq; + using Ocelot.Configuration; + using Ocelot.Configuration.Builder; + using Ocelot.DownstreamRouteFinder; + using Ocelot.DownstreamRouteFinder.UrlMatcher; + using Ocelot.Logging; + using Ocelot.QueryStrings; + using Ocelot.QueryStrings.Middleware; + using Ocelot.Responses; + using TestStack.BDDfy; + using Xunit; + using System.Security.Claims; + using Microsoft.AspNetCore.Http; + using System.Threading.Tasks; + using Ocelot.Request.Middleware; + + public class ClaimsToQueryStringMiddlewareTests + { + private readonly Mock _addQueries; + private Mock _loggerFactory; + private Mock _logger; + private ClaimsToQueryStringMiddleware _middleware; + private DownstreamContext _downstreamContext; + private OcelotRequestDelegate _next; + + public ClaimsToQueryStringMiddlewareTests() + { + _downstreamContext = new DownstreamContext(new DefaultHttpContext()); + _loggerFactory = new Mock(); + _logger = new Mock(); + _loggerFactory.Setup(x => x.CreateLogger()).Returns(_logger.Object); + _next = context => Task.CompletedTask; + _addQueries = new Mock(); + _downstreamContext.DownstreamRequest = new DownstreamRequest(new HttpRequestMessage(HttpMethod.Get, "http://test.com")); + _middleware = new ClaimsToQueryStringMiddleware(_next, _loggerFactory.Object, _addQueries.Object); + } + + [Fact] + public void should_call_add_queries_correctly() + { + var downstreamRoute = new DownstreamRoute(new List(), + new ReRouteBuilder() + .WithDownstreamReRoute(new DownstreamReRouteBuilder() + .WithDownstreamPathTemplate("any old string") + .WithClaimsToQueries(new List + { + new ClaimToThing("UserId", "Subject", "", 0) + }) + .WithUpstreamHttpMethod(new List { "Get" }) + .Build()) + .WithUpstreamHttpMethod(new List { "Get" }) + .Build()); + + this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute)) + .And(x => x.GivenTheAddHeadersToRequestReturnsOk()) + .When(x => x.WhenICallTheMiddleware()) + .Then(x => x.ThenTheAddQueriesToRequestIsCalledCorrectly()) + .BDDfy(); + } + + private void WhenICallTheMiddleware() + { + _middleware.Invoke(_downstreamContext).GetAwaiter().GetResult(); + } + + private void GivenTheAddHeadersToRequestReturnsOk() + { + _addQueries + .Setup(x => x.SetQueriesOnDownstreamRequest( + It.IsAny>(), + It.IsAny>(), + It.IsAny())) + .Returns(new OkResponse()); + } + + private void ThenTheAddQueriesToRequestIsCalledCorrectly() + { + _addQueries + .Verify(x => x.SetQueriesOnDownstreamRequest( + It.IsAny>(), + It.IsAny>(), + _downstreamContext.DownstreamRequest), Times.Once); + } + + private void GivenTheDownStreamRouteIs(DownstreamRoute downstreamRoute) + { + _downstreamContext.TemplatePlaceholderNameAndValues = downstreamRoute.TemplatePlaceholderNameAndValues; + _downstreamContext.DownstreamReRoute = downstreamRoute.ReRoute.DownstreamReRoute[0]; + } + } +}