mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-04-22 06:22:50 +08:00
Merge pull request #31 from TomPallister/feature/use-service-provider-config-builder
Feature/use service provider config builder
This commit is contained in:
commit
04fb12d1ac
6
.gitignore
vendored
6
.gitignore
vendored
@ -236,3 +236,9 @@ _Pvt_Extensions
|
|||||||
# FAKE - F# Make
|
# FAKE - F# Make
|
||||||
.fake/
|
.fake/
|
||||||
tools/
|
tools/
|
||||||
|
|
||||||
|
# MacOS
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Ocelot acceptance test config
|
||||||
|
test/Ocelot.AcceptanceTests/configuration.json
|
10
README.md
10
README.md
@ -122,7 +122,7 @@ Ocelot's primary functionality is to take incomeing http requests and forward th
|
|||||||
to a downstream service. At the moment in the form of another http request (in the future
|
to a downstream service. At the moment in the form of another http request (in the future
|
||||||
this could be any transport mechanism.).
|
this could be any transport mechanism.).
|
||||||
|
|
||||||
Ocelot always adds a trailing slash to an UpstreamTemplate.
|
Ocelot always adds a trailing slash to an UpstreamPathTemplate.
|
||||||
|
|
||||||
Ocelot's describes the routing of one request to another as a ReRoute. In order to get
|
Ocelot's describes the routing of one request to another as a ReRoute. In order to get
|
||||||
anything working in Ocelot you need to set up a ReRoute in the configuration.
|
anything working in Ocelot you need to set up a ReRoute in the configuration.
|
||||||
@ -140,16 +140,16 @@ the following.
|
|||||||
"DownstreamScheme": "https",
|
"DownstreamScheme": "https",
|
||||||
"DownstreamPort": 80,
|
"DownstreamPort": 80,
|
||||||
"DownstreamHost" "localhost"
|
"DownstreamHost" "localhost"
|
||||||
"UpstreamTemplate": "/posts/{postId}",
|
"UpstreamPathTemplate": "/posts/{postId}",
|
||||||
"UpstreamHttpMethod": "Put"
|
"UpstreamHttpMethod": "Put"
|
||||||
}
|
}
|
||||||
|
|
||||||
The DownstreamPathTemplate,Scheme, Port and Host make the URL that this request will be forwarded to.
|
The DownstreamPathTemplate,Scheme, Port and Host make the URL that this request will be forwarded to.
|
||||||
The UpstreamTemplate is the URL that Ocelot will use to identity which
|
The UpstreamPathTemplate is the URL that Ocelot will use to identity which
|
||||||
DownstreamPathTemplate to use for a given request. Finally the UpstreamHttpMethod is used so
|
DownstreamPathTemplate to use for a given request. Finally the UpstreamHttpMethod is used so
|
||||||
Ocelot can distinguish between requests to the same URL and is obviously needed to work :)
|
Ocelot can distinguish between requests to the same URL and is obviously needed to work :)
|
||||||
In Ocelot you can add placeholders for variables to your Templates in the form of {something}.
|
In Ocelot you can add placeholders for variables to your Templates in the form of {something}.
|
||||||
The placeholder needs to be in both the DownstreamPathTemplate and UpstreamTemplate. If it is
|
The placeholder needs to be in both the DownstreamPathTemplate and UpstreamPathTemplate. If it is
|
||||||
Ocelot will attempt to replace the placeholder with the correct variable value from the
|
Ocelot will attempt to replace the placeholder with the correct variable value from the
|
||||||
Upstream URL when the request comes in.
|
Upstream URL when the request comes in.
|
||||||
|
|
||||||
@ -190,7 +190,7 @@ and LeastConnection algorithm you can use. If no load balancer is specified Ocel
|
|||||||
{
|
{
|
||||||
"DownstreamPathTemplate": "/api/posts/{postId}",
|
"DownstreamPathTemplate": "/api/posts/{postId}",
|
||||||
"DownstreamScheme": "https",
|
"DownstreamScheme": "https",
|
||||||
"UpstreamTemplate": "/posts/{postId}",
|
"UpstreamPathTemplate": "/posts/{postId}",
|
||||||
"UpstreamHttpMethod": "Put",
|
"UpstreamHttpMethod": "Put",
|
||||||
"ServiceName": "product"
|
"ServiceName": "product"
|
||||||
"LoadBalancer": "LeastConnection"
|
"LoadBalancer": "LeastConnection"
|
||||||
|
@ -42,7 +42,7 @@ var nugetFeedStableSymbolsUploadUrl = "https://www.nuget.org/api/v2/package";
|
|||||||
|
|
||||||
// internal build variables - don't change these.
|
// internal build variables - don't change these.
|
||||||
var releaseTag = "";
|
var releaseTag = "";
|
||||||
var committedVersion = "0.0.0-dev";
|
string committedVersion = "0.0.0-dev";
|
||||||
var buildVersion = committedVersion;
|
var buildVersion = committedVersion;
|
||||||
|
|
||||||
var target = Argument("target", "Default");
|
var target = Argument("target", "Default");
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
# The path template we are listening on for this re route, Ocelot will add a trailing
|
# The path template we are listening on for this re route, Ocelot will add a trailing
|
||||||
# slash to this property. Then when a request is made Ocelot makes sure a trailing
|
# slash to this property. Then when a request is made Ocelot makes sure a trailing
|
||||||
# slash is added, so everything matches
|
# slash is added, so everything matches
|
||||||
"UpstreamTemplate": "/identityserverexample",
|
"UpstreamPathTemplate": "/identityserverexample",
|
||||||
# The method we are listening for on this re route
|
# The method we are listening for on this re route
|
||||||
"UpstreamHttpMethod": "Get",
|
"UpstreamHttpMethod": "Get",
|
||||||
# Only support identity server at the moment
|
# Only support identity server at the moment
|
||||||
|
@ -12,7 +12,7 @@ namespace Ocelot.Authentication.Handler.Creator
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class AuthenticationHandlerCreator : IAuthenticationHandlerCreator
|
public class AuthenticationHandlerCreator : IAuthenticationHandlerCreator
|
||||||
{
|
{
|
||||||
public Response<RequestDelegate> CreateIdentityServerAuthenticationHandler(IApplicationBuilder app, AuthenticationOptions authOptions)
|
public Response<RequestDelegate> Create(IApplicationBuilder app, AuthenticationOptions authOptions)
|
||||||
{
|
{
|
||||||
var builder = app.New();
|
var builder = app.New();
|
||||||
|
|
||||||
|
@ -8,6 +8,6 @@ namespace Ocelot.Authentication.Handler.Creator
|
|||||||
|
|
||||||
public interface IAuthenticationHandlerCreator
|
public interface IAuthenticationHandlerCreator
|
||||||
{
|
{
|
||||||
Response<RequestDelegate> CreateIdentityServerAuthenticationHandler(IApplicationBuilder app, AuthenticationOptions authOptions);
|
Response<RequestDelegate> Create(IApplicationBuilder app, AuthenticationOptions authOptions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ namespace Ocelot.Authentication.Handler.Factory
|
|||||||
|
|
||||||
public Response<AuthenticationHandler> Get(IApplicationBuilder app, AuthenticationOptions authOptions)
|
public Response<AuthenticationHandler> Get(IApplicationBuilder app, AuthenticationOptions authOptions)
|
||||||
{
|
{
|
||||||
var handler = _creator.CreateIdentityServerAuthenticationHandler(app, authOptions);
|
var handler = _creator.Create(app, authOptions);
|
||||||
|
|
||||||
if (!handler.IsError)
|
if (!handler.IsError)
|
||||||
{
|
{
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Ocelot.Authentication.Handler.Factory;
|
using Ocelot.Authentication.Handler.Factory;
|
||||||
using Ocelot.Configuration;
|
using Ocelot.Configuration;
|
||||||
using Ocelot.Errors;
|
using Ocelot.Errors;
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using Ocelot.Errors;
|
using Ocelot.Errors;
|
||||||
using Ocelot.Responses;
|
using Ocelot.Responses;
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
using Ocelot.Infrastructure.RequestData;
|
||||||
using Ocelot.Infrastructure.RequestData;
|
|
||||||
using Ocelot.Logging;
|
using Ocelot.Logging;
|
||||||
using Ocelot.Responses;
|
using Ocelot.Responses;
|
||||||
|
|
||||||
@ -61,7 +60,7 @@ namespace Ocelot.Authorisation.Middleware
|
|||||||
SetPipelineError(new List<Error>
|
SetPipelineError(new List<Error>
|
||||||
{
|
{
|
||||||
new UnauthorisedError(
|
new UnauthorisedError(
|
||||||
$"{context.User.Identity.Name} unable to access {DownstreamRoute.ReRoute.UpstreamTemplate}")
|
$"{context.User.Identity.Name} unable to access {DownstreamRoute.ReRoute.UpstreamPathTemplate.Value}")
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Ocelot.Configuration.Builder
|
||||||
|
{
|
||||||
|
public class AuthenticationOptionsBuilder
|
||||||
|
{
|
||||||
|
|
||||||
|
private string _provider;
|
||||||
|
private string _providerRootUrl;
|
||||||
|
private string _scopeName;
|
||||||
|
private string _scopeSecret;
|
||||||
|
private bool _requireHttps;
|
||||||
|
private List<string> _additionalScopes;
|
||||||
|
|
||||||
|
public AuthenticationOptionsBuilder WithProvider(string provider)
|
||||||
|
{
|
||||||
|
_provider = provider;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthenticationOptionsBuilder WithProviderRootUrl(string providerRootUrl)
|
||||||
|
{
|
||||||
|
_providerRootUrl = providerRootUrl;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthenticationOptionsBuilder WithScopeName(string scopeName)
|
||||||
|
{
|
||||||
|
_scopeName = scopeName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthenticationOptionsBuilder WithScopeSecret(string scopeSecret)
|
||||||
|
{
|
||||||
|
_scopeSecret = scopeSecret;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthenticationOptionsBuilder WithRequireHttps(bool requireHttps)
|
||||||
|
{
|
||||||
|
_requireHttps = requireHttps;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthenticationOptionsBuilder WithAdditionalScopes(List<string> additionalScopes)
|
||||||
|
{
|
||||||
|
_additionalScopes = additionalScopes;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthenticationOptions Build()
|
||||||
|
{
|
||||||
|
return new AuthenticationOptions(_provider, _providerRootUrl, _scopeName, _requireHttps, _additionalScopes, _scopeSecret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,23 +1,19 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Net.Http;
|
||||||
using Ocelot.Values;
|
using Ocelot.Values;
|
||||||
|
|
||||||
namespace Ocelot.Configuration.Builder
|
namespace Ocelot.Configuration.Builder
|
||||||
{
|
{
|
||||||
public class ReRouteBuilder
|
public class ReRouteBuilder
|
||||||
{
|
{
|
||||||
|
private AuthenticationOptions _authenticationOptions;
|
||||||
private string _loadBalancerKey;
|
private string _loadBalancerKey;
|
||||||
private string _downstreamPathTemplate;
|
private string _downstreamPathTemplate;
|
||||||
private string _upstreamTemplate;
|
private string _upstreamTemplate;
|
||||||
private string _upstreamTemplatePattern;
|
private string _upstreamTemplatePattern;
|
||||||
private string _upstreamHttpMethod;
|
private string _upstreamHttpMethod;
|
||||||
private bool _isAuthenticated;
|
private bool _isAuthenticated;
|
||||||
private string _authenticationProvider;
|
|
||||||
private string _authenticationProviderUrl;
|
|
||||||
private string _scopeName;
|
|
||||||
private List<string> _additionalScopes;
|
|
||||||
private bool _requireHttps;
|
|
||||||
private string _scopeSecret;
|
|
||||||
private List<ClaimToThing> _configHeaderExtractorProperties;
|
private List<ClaimToThing> _configHeaderExtractorProperties;
|
||||||
private List<ClaimToThing> _claimToClaims;
|
private List<ClaimToThing> _claimToClaims;
|
||||||
private Dictionary<string, string> _routeClaimRequirement;
|
private Dictionary<string, string> _routeClaimRequirement;
|
||||||
@ -26,25 +22,15 @@ namespace Ocelot.Configuration.Builder
|
|||||||
private string _requestIdHeaderKey;
|
private string _requestIdHeaderKey;
|
||||||
private bool _isCached;
|
private bool _isCached;
|
||||||
private CacheOptions _fileCacheOptions;
|
private CacheOptions _fileCacheOptions;
|
||||||
private bool _useServiceDiscovery;
|
|
||||||
private string _serviceName;
|
private string _serviceName;
|
||||||
private string _serviceDiscoveryProvider;
|
|
||||||
private string _serviceDiscoveryAddress;
|
|
||||||
private string _downstreamScheme;
|
private string _downstreamScheme;
|
||||||
private string _downstreamHost;
|
private string _downstreamHost;
|
||||||
private int _dsPort;
|
private int _downstreamPort;
|
||||||
private string _loadBalancer;
|
private string _loadBalancer;
|
||||||
private string _serviceProviderHost;
|
private ServiceProviderConfiguraion _serviceProviderConfiguraion;
|
||||||
private int _serviceProviderPort;
|
|
||||||
private bool _useQos;
|
private bool _useQos;
|
||||||
private QoSOptions _qosOptions;
|
private QoSOptions _qosOptions;
|
||||||
|
|
||||||
|
|
||||||
public ReRouteBuilder()
|
|
||||||
{
|
|
||||||
_additionalScopes = new List<string>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReRouteBuilder WithLoadBalancer(string loadBalancer)
|
public ReRouteBuilder WithLoadBalancer(string loadBalancer)
|
||||||
{
|
{
|
||||||
_loadBalancer = loadBalancer;
|
_loadBalancer = loadBalancer;
|
||||||
@ -63,37 +49,19 @@ namespace Ocelot.Configuration.Builder
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReRouteBuilder WithServiceDiscoveryAddress(string serviceDiscoveryAddress)
|
|
||||||
{
|
|
||||||
_serviceDiscoveryAddress = serviceDiscoveryAddress;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReRouteBuilder WithServiceDiscoveryProvider(string serviceDiscoveryProvider)
|
|
||||||
{
|
|
||||||
_serviceDiscoveryProvider = serviceDiscoveryProvider;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReRouteBuilder WithServiceName(string serviceName)
|
public ReRouteBuilder WithServiceName(string serviceName)
|
||||||
{
|
{
|
||||||
_serviceName = serviceName;
|
_serviceName = serviceName;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReRouteBuilder WithUseServiceDiscovery(bool useServiceDiscovery)
|
|
||||||
{
|
|
||||||
_useServiceDiscovery = useServiceDiscovery;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReRouteBuilder WithDownstreamPathTemplate(string input)
|
public ReRouteBuilder WithDownstreamPathTemplate(string input)
|
||||||
{
|
{
|
||||||
_downstreamPathTemplate = input;
|
_downstreamPathTemplate = input;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReRouteBuilder WithUpstreamTemplate(string input)
|
public ReRouteBuilder WithUpstreamPathTemplate(string input)
|
||||||
{
|
{
|
||||||
_upstreamTemplate = input;
|
_upstreamTemplate = input;
|
||||||
return this;
|
return this;
|
||||||
@ -121,42 +89,6 @@ namespace Ocelot.Configuration.Builder
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReRouteBuilder WithAuthenticationProvider(string input)
|
|
||||||
{
|
|
||||||
_authenticationProvider = input;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReRouteBuilder WithAuthenticationProviderUrl(string input)
|
|
||||||
{
|
|
||||||
_authenticationProviderUrl = input;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReRouteBuilder WithAuthenticationProviderScopeName(string input)
|
|
||||||
{
|
|
||||||
_scopeName = input;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReRouteBuilder WithAuthenticationProviderAdditionalScopes(List<string> input)
|
|
||||||
{
|
|
||||||
_additionalScopes = input;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReRouteBuilder WithRequireHttps(bool input)
|
|
||||||
{
|
|
||||||
_requireHttps = input;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReRouteBuilder WithScopeSecret(string input)
|
|
||||||
{
|
|
||||||
_scopeSecret = input;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReRouteBuilder WithRequestIdKey(string input)
|
public ReRouteBuilder WithRequestIdKey(string input)
|
||||||
{
|
{
|
||||||
_requestIdHeaderKey = input;
|
_requestIdHeaderKey = input;
|
||||||
@ -201,7 +133,7 @@ namespace Ocelot.Configuration.Builder
|
|||||||
|
|
||||||
public ReRouteBuilder WithDownstreamPort(int port)
|
public ReRouteBuilder WithDownstreamPort(int port)
|
||||||
{
|
{
|
||||||
_dsPort = port;
|
_downstreamPort = port;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,28 +156,43 @@ namespace Ocelot.Configuration.Builder
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReRouteBuilder WithServiceProviderHost(string serviceProviderHost)
|
public ReRouteBuilder WithServiceProviderConfiguraion(ServiceProviderConfiguraion serviceProviderConfiguraion)
|
||||||
{
|
{
|
||||||
_serviceProviderHost = serviceProviderHost;
|
_serviceProviderConfiguraion = serviceProviderConfiguraion;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReRouteBuilder WithServiceProviderPort(int serviceProviderPort)
|
public ReRouteBuilder WithAuthenticationOptions(AuthenticationOptions authenticationOptions)
|
||||||
{
|
{
|
||||||
_serviceProviderPort = serviceProviderPort;
|
_authenticationOptions = authenticationOptions;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReRoute Build()
|
public ReRoute Build()
|
||||||
{
|
{
|
||||||
return new ReRoute(new DownstreamPathTemplate(_downstreamPathTemplate), _upstreamTemplate, _upstreamHttpMethod, _upstreamTemplatePattern,
|
return new ReRoute(
|
||||||
_isAuthenticated, new AuthenticationOptions(_authenticationProvider, _authenticationProviderUrl, _scopeName,
|
new PathTemplate(_downstreamPathTemplate),
|
||||||
_requireHttps, _additionalScopes, _scopeSecret), _configHeaderExtractorProperties, _claimToClaims, _routeClaimRequirement,
|
new PathTemplate(_upstreamTemplate),
|
||||||
_isAuthorised, _claimToQueries, _requestIdHeaderKey, _isCached, _fileCacheOptions, _downstreamScheme, _loadBalancer,
|
new HttpMethod(_upstreamHttpMethod),
|
||||||
_downstreamHost, _dsPort, _loadBalancerKey, new ServiceProviderConfiguraion(_serviceName, _downstreamHost, _dsPort, _useServiceDiscovery,
|
_upstreamTemplatePattern,
|
||||||
_serviceDiscoveryProvider, _serviceProviderHost, _serviceProviderPort),
|
_isAuthenticated,
|
||||||
_useQos,_qosOptions);
|
_authenticationOptions,
|
||||||
|
_configHeaderExtractorProperties,
|
||||||
|
_claimToClaims,
|
||||||
|
_routeClaimRequirement,
|
||||||
|
_isAuthorised,
|
||||||
|
_claimToQueries,
|
||||||
|
_requestIdHeaderKey,
|
||||||
|
_isCached,
|
||||||
|
_fileCacheOptions,
|
||||||
|
_downstreamScheme,
|
||||||
|
_loadBalancer,
|
||||||
|
_downstreamHost,
|
||||||
|
_downstreamPort,
|
||||||
|
_loadBalancerKey,
|
||||||
|
_serviceProviderConfiguraion,
|
||||||
|
_useQos,
|
||||||
|
_qosOptions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
namespace Ocelot.Configuration.Builder
|
||||||
|
{
|
||||||
|
public class ServiceProviderConfiguraionBuilder
|
||||||
|
{
|
||||||
|
private string _serviceName;
|
||||||
|
private string _downstreamHost;
|
||||||
|
private int _downstreamPort;
|
||||||
|
private bool _userServiceDiscovery;
|
||||||
|
private string _serviceDiscoveryProvider;
|
||||||
|
private string _serviceDiscoveryProviderHost;
|
||||||
|
private int _serviceDiscoveryProviderPort;
|
||||||
|
|
||||||
|
public ServiceProviderConfiguraionBuilder WithServiceName(string serviceName)
|
||||||
|
{
|
||||||
|
_serviceName = serviceName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceProviderConfiguraionBuilder WithDownstreamHost(string downstreamHost)
|
||||||
|
{
|
||||||
|
_downstreamHost = downstreamHost;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceProviderConfiguraionBuilder WithDownstreamPort(int downstreamPort)
|
||||||
|
{
|
||||||
|
_downstreamPort = downstreamPort;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceProviderConfiguraionBuilder WithUseServiceDiscovery(bool userServiceDiscovery)
|
||||||
|
{
|
||||||
|
_userServiceDiscovery = userServiceDiscovery;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceProviderConfiguraionBuilder WithServiceDiscoveryProvider(string serviceDiscoveryProvider)
|
||||||
|
{
|
||||||
|
_serviceDiscoveryProvider = serviceDiscoveryProvider;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceProviderConfiguraionBuilder WithServiceDiscoveryProviderHost(string serviceDiscoveryProviderHost)
|
||||||
|
{
|
||||||
|
_serviceDiscoveryProviderHost = serviceDiscoveryProviderHost;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceProviderConfiguraionBuilder WithServiceDiscoveryProviderPort(int serviceDiscoveryProviderPort)
|
||||||
|
{
|
||||||
|
_serviceDiscoveryProviderPort = serviceDiscoveryProviderPort;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public ServiceProviderConfiguraion Build()
|
||||||
|
{
|
||||||
|
return new ServiceProviderConfiguraion(_serviceName, _downstreamHost, _downstreamPort, _userServiceDiscovery,
|
||||||
|
_serviceDiscoveryProvider, _serviceDiscoveryProviderHost,_serviceDiscoveryProviderPort);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,9 +1,11 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Net.Http;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
using Ocelot.Configuration.Builder;
|
||||||
using Ocelot.Configuration.File;
|
using Ocelot.Configuration.File;
|
||||||
using Ocelot.Configuration.Parser;
|
using Ocelot.Configuration.Parser;
|
||||||
using Ocelot.Configuration.Validator;
|
using Ocelot.Configuration.Validator;
|
||||||
@ -53,10 +55,6 @@ namespace Ocelot.Configuration.Creator
|
|||||||
return new OkResponse<IOcelotConfiguration>(config);
|
return new OkResponse<IOcelotConfiguration>(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This method is meant to be tempoary to convert a config to an ocelot config...probably wont keep this but we will see
|
|
||||||
/// will need a refactor at some point as its crap
|
|
||||||
/// </summary>
|
|
||||||
private async Task<IOcelotConfiguration> SetUpConfiguration()
|
private async Task<IOcelotConfiguration> SetUpConfiguration()
|
||||||
{
|
{
|
||||||
var response = _configurationValidator.IsValid(_options.Value);
|
var response = _configurationValidator.IsValid(_options.Value);
|
||||||
@ -86,82 +84,129 @@ namespace Ocelot.Configuration.Creator
|
|||||||
|
|
||||||
private async Task<ReRoute> SetUpReRoute(FileReRoute fileReRoute, FileGlobalConfiguration globalConfiguration)
|
private async Task<ReRoute> SetUpReRoute(FileReRoute fileReRoute, FileGlobalConfiguration globalConfiguration)
|
||||||
{
|
{
|
||||||
var globalRequestIdConfiguration = !string.IsNullOrEmpty(globalConfiguration?.RequestIdKey);
|
var isAuthenticated = IsAuthenticated(fileReRoute);
|
||||||
|
|
||||||
var upstreamTemplate = BuildUpstreamTemplate(fileReRoute);
|
var isAuthorised = IsAuthenticated(fileReRoute);
|
||||||
|
|
||||||
var isAuthenticated = !string.IsNullOrEmpty(fileReRoute.AuthenticationOptions?.Provider);
|
var isCached = IsCached(fileReRoute);
|
||||||
|
|
||||||
var isAuthorised = fileReRoute.RouteClaimsRequirement?.Count > 0;
|
var requestIdKey = BuildRequestId(fileReRoute, globalConfiguration);
|
||||||
|
|
||||||
var isCached = fileReRoute.FileCacheOptions.TtlSeconds > 0;
|
var loadBalancerKey = BuildLoadBalancerKey(fileReRoute);
|
||||||
|
|
||||||
|
var upstreamTemplatePattern = BuildUpstreamTemplate(fileReRoute);
|
||||||
var isQos = fileReRoute.QoSOptions.ExceptionsAllowedBeforeBreaking > 0 && fileReRoute.QoSOptions.TimeoutValue >0;
|
var isQos = fileReRoute.QoSOptions.ExceptionsAllowedBeforeBreaking > 0 && fileReRoute.QoSOptions.TimeoutValue >0;
|
||||||
|
|
||||||
var requestIdKey = globalRequestIdConfiguration
|
var serviceProviderConfiguration = BuildServiceProviderConfiguration(fileReRoute, globalConfiguration);
|
||||||
|
|
||||||
|
var authOptionsForRoute = BuildAuthenticationOptions(fileReRoute);
|
||||||
|
|
||||||
|
var claimsToHeaders = BuildAddThingsToRequest(fileReRoute.AddHeadersToRequest);
|
||||||
|
|
||||||
|
|
||||||
|
var claimsToClaims = BuildAddThingsToRequest(fileReRoute.AddClaimsToRequest);
|
||||||
|
|
||||||
|
var claimsToQueries = BuildAddThingsToRequest(fileReRoute.AddQueriesToRequest);
|
||||||
|
|
||||||
|
var reRoute = new ReRouteBuilder()
|
||||||
|
.WithDownstreamPathTemplate(fileReRoute.DownstreamPathTemplate)
|
||||||
|
.WithUpstreamPathTemplate(fileReRoute.UpstreamPathTemplate)
|
||||||
|
.WithUpstreamHttpMethod(fileReRoute.UpstreamHttpMethod)
|
||||||
|
.WithUpstreamTemplatePattern(upstreamTemplatePattern)
|
||||||
|
.WithIsAuthenticated(isAuthenticated)
|
||||||
|
.WithAuthenticationOptions(authOptionsForRoute)
|
||||||
|
.WithClaimsToHeaders(claimsToHeaders)
|
||||||
|
.WithClaimsToClaims(claimsToClaims)
|
||||||
|
.WithRouteClaimsRequirement(fileReRoute.RouteClaimsRequirement)
|
||||||
|
.WithIsAuthorised(isAuthorised)
|
||||||
|
.WithClaimsToQueries(claimsToQueries)
|
||||||
|
.WithRequestIdKey(requestIdKey)
|
||||||
|
.WithIsCached(isCached)
|
||||||
|
.WithCacheOptions(new CacheOptions(fileReRoute.FileCacheOptions.TtlSeconds))
|
||||||
|
.WithDownstreamScheme(fileReRoute.DownstreamScheme)
|
||||||
|
.WithLoadBalancer(fileReRoute.LoadBalancer)
|
||||||
|
.WithDownstreamHost(fileReRoute.DownstreamHost)
|
||||||
|
.WithDownstreamPort(fileReRoute.DownstreamPort)
|
||||||
|
.WithLoadBalancerKey(loadBalancerKey)
|
||||||
|
.WithServiceProviderConfiguraion(serviceProviderConfiguration)
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
await SetupLoadBalancer(reRoute);
|
||||||
|
return reRoute;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsAuthenticated(FileReRoute fileReRoute)
|
||||||
|
{
|
||||||
|
return !string.IsNullOrEmpty(fileReRoute.AuthenticationOptions?.Provider);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsAuthorised(FileReRoute fileReRoute)
|
||||||
|
{
|
||||||
|
return fileReRoute.RouteClaimsRequirement?.Count > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsCached(FileReRoute fileReRoute)
|
||||||
|
{
|
||||||
|
return fileReRoute.FileCacheOptions.TtlSeconds > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string BuildRequestId(FileReRoute fileReRoute, FileGlobalConfiguration globalConfiguration)
|
||||||
|
{
|
||||||
|
var globalRequestIdConfiguration = !string.IsNullOrEmpty(globalConfiguration?.RequestIdKey);
|
||||||
|
|
||||||
|
var requestIdKey = globalRequestIdConfiguration
|
||||||
? globalConfiguration.RequestIdKey
|
? globalConfiguration.RequestIdKey
|
||||||
: fileReRoute.RequestIdKey;
|
: fileReRoute.RequestIdKey;
|
||||||
|
|
||||||
|
return requestIdKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string BuildLoadBalancerKey(FileReRoute fileReRoute)
|
||||||
|
{
|
||||||
|
//note - not sure if this is the correct key, but this is probably the only unique key i can think of given my poor brain
|
||||||
|
var loadBalancerKey = $"{fileReRoute.UpstreamPathTemplate}{fileReRoute.UpstreamHttpMethod}";
|
||||||
|
return loadBalancerKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
private AuthenticationOptions BuildAuthenticationOptions(FileReRoute fileReRoute)
|
||||||
|
{
|
||||||
|
return new AuthenticationOptionsBuilder()
|
||||||
|
.WithProvider(fileReRoute.AuthenticationOptions?.Provider)
|
||||||
|
.WithProviderRootUrl(fileReRoute.AuthenticationOptions?.ProviderRootUrl)
|
||||||
|
.WithScopeName(fileReRoute.AuthenticationOptions?.ScopeName)
|
||||||
|
.WithRequireHttps(fileReRoute.AuthenticationOptions.RequireHttps)
|
||||||
|
.WithAdditionalScopes(fileReRoute.AuthenticationOptions?.AdditionalScopes)
|
||||||
|
.WithScopeSecret(fileReRoute.AuthenticationOptions?.ScopeSecret)
|
||||||
|
.Build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SetupLoadBalancer(ReRoute reRoute)
|
||||||
|
{
|
||||||
|
var loadBalancer = await _loadBalanceFactory.Get(reRoute);
|
||||||
|
_loadBalancerHouse.Add(reRoute.LoadBalancerKey, loadBalancer);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ServiceProviderConfiguraion BuildServiceProviderConfiguration(FileReRoute fileReRoute, FileGlobalConfiguration globalConfiguration)
|
||||||
|
{
|
||||||
var useServiceDiscovery = !string.IsNullOrEmpty(fileReRoute.ServiceName)
|
var useServiceDiscovery = !string.IsNullOrEmpty(fileReRoute.ServiceName)
|
||||||
&& !string.IsNullOrEmpty(globalConfiguration?.ServiceDiscoveryProvider?.Provider);
|
&& !string.IsNullOrEmpty(globalConfiguration?.ServiceDiscoveryProvider?.Provider);
|
||||||
|
|
||||||
//note - not sure if this is the correct key, but this is probably the only unique key i can think of given my poor brain
|
|
||||||
var loadBalancerKey = $"{fileReRoute.UpstreamTemplate}{fileReRoute.UpstreamHttpMethod}";
|
|
||||||
|
|
||||||
ReRoute reRoute;
|
|
||||||
|
|
||||||
|
|
||||||
var serviceProviderPort = globalConfiguration?.ServiceDiscoveryProvider?.Port ?? 0;
|
var serviceProviderPort = globalConfiguration?.ServiceDiscoveryProvider?.Port ?? 0;
|
||||||
|
|
||||||
var serviceProviderConfiguration = new ServiceProviderConfiguraion(fileReRoute.ServiceName,
|
return new ServiceProviderConfiguraionBuilder()
|
||||||
fileReRoute.DownstreamHost, fileReRoute.DownstreamPort, useServiceDiscovery,
|
.WithServiceName(fileReRoute.ServiceName)
|
||||||
globalConfiguration?.ServiceDiscoveryProvider?.Provider, globalConfiguration?.ServiceDiscoveryProvider?.Host,
|
.WithDownstreamHost(fileReRoute.DownstreamHost)
|
||||||
serviceProviderPort);
|
.WithDownstreamPort(fileReRoute.DownstreamPort)
|
||||||
|
.WithUseServiceDiscovery(useServiceDiscovery)
|
||||||
if (isAuthenticated)
|
.WithServiceDiscoveryProvider(globalConfiguration?.ServiceDiscoveryProvider?.Provider)
|
||||||
{
|
.WithServiceDiscoveryProviderHost(globalConfiguration?.ServiceDiscoveryProvider?.Host)
|
||||||
var authOptionsForRoute = new AuthenticationOptions(fileReRoute.AuthenticationOptions.Provider,
|
.WithServiceDiscoveryProviderPort(serviceProviderPort)
|
||||||
fileReRoute.AuthenticationOptions.ProviderRootUrl, fileReRoute.AuthenticationOptions.ScopeName,
|
.Build();
|
||||||
fileReRoute.AuthenticationOptions.RequireHttps, fileReRoute.AuthenticationOptions.AdditionalScopes,
|
|
||||||
fileReRoute.AuthenticationOptions.ScopeSecret);
|
|
||||||
|
|
||||||
var claimsToHeaders = GetAddThingsToRequest(fileReRoute.AddHeadersToRequest);
|
|
||||||
var claimsToClaims = GetAddThingsToRequest(fileReRoute.AddClaimsToRequest);
|
|
||||||
var claimsToQueries = GetAddThingsToRequest(fileReRoute.AddQueriesToRequest);
|
|
||||||
|
|
||||||
reRoute = new ReRoute(new DownstreamPathTemplate(fileReRoute.DownstreamPathTemplate),
|
|
||||||
fileReRoute.UpstreamTemplate,
|
|
||||||
fileReRoute.UpstreamHttpMethod, upstreamTemplate, isAuthenticated,
|
|
||||||
authOptionsForRoute, claimsToHeaders, claimsToClaims,
|
|
||||||
fileReRoute.RouteClaimsRequirement, isAuthorised, claimsToQueries,
|
|
||||||
requestIdKey, isCached, new CacheOptions(fileReRoute.FileCacheOptions.TtlSeconds)
|
|
||||||
, fileReRoute.DownstreamScheme,
|
|
||||||
fileReRoute.LoadBalancer, fileReRoute.DownstreamHost, fileReRoute.DownstreamPort, loadBalancerKey,
|
|
||||||
serviceProviderConfiguration, isQos,
|
|
||||||
new QoSOptions(fileReRoute.QoSOptions.ExceptionsAllowedBeforeBreaking, fileReRoute.QoSOptions.DurationOfBreak, fileReRoute.QoSOptions.TimeoutValue));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
reRoute = new ReRoute(new DownstreamPathTemplate(fileReRoute.DownstreamPathTemplate),
|
|
||||||
fileReRoute.UpstreamTemplate,
|
|
||||||
fileReRoute.UpstreamHttpMethod, upstreamTemplate, isAuthenticated,
|
|
||||||
null, new List<ClaimToThing>(), new List<ClaimToThing>(),
|
|
||||||
fileReRoute.RouteClaimsRequirement, isAuthorised, new List<ClaimToThing>(),
|
|
||||||
requestIdKey, isCached, new CacheOptions(fileReRoute.FileCacheOptions.TtlSeconds),
|
|
||||||
fileReRoute.DownstreamScheme,
|
|
||||||
fileReRoute.LoadBalancer, fileReRoute.DownstreamHost, fileReRoute.DownstreamPort, loadBalancerKey,
|
|
||||||
serviceProviderConfiguration, isQos,
|
|
||||||
new QoSOptions(fileReRoute.QoSOptions.ExceptionsAllowedBeforeBreaking, fileReRoute.QoSOptions.DurationOfBreak, fileReRoute.QoSOptions.TimeoutValue));
|
|
||||||
}
|
|
||||||
|
|
||||||
var loadBalancer = await _loadBalanceFactory.Get(reRoute);
|
|
||||||
_loadBalancerHouse.Add(reRoute.LoadBalancerKey, loadBalancer);
|
|
||||||
return reRoute;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private string BuildUpstreamTemplate(FileReRoute reRoute)
|
private string BuildUpstreamTemplate(FileReRoute reRoute)
|
||||||
{
|
{
|
||||||
var upstreamTemplate = reRoute.UpstreamTemplate;
|
var upstreamTemplate = reRoute.UpstreamPathTemplate;
|
||||||
|
|
||||||
upstreamTemplate = upstreamTemplate.SetLastCharacterAs('/');
|
upstreamTemplate = upstreamTemplate.SetLastCharacterAs('/');
|
||||||
|
|
||||||
@ -190,7 +235,7 @@ namespace Ocelot.Configuration.Creator
|
|||||||
return route;
|
return route;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<ClaimToThing> GetAddThingsToRequest(Dictionary<string,string> thingBeingAdded)
|
private List<ClaimToThing> BuildAddThingsToRequest(Dictionary<string,string> thingBeingAdded)
|
||||||
{
|
{
|
||||||
var claimsToTHings = new List<ClaimToThing>();
|
var claimsToTHings = new List<ClaimToThing>();
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ namespace Ocelot.Configuration.File
|
|||||||
}
|
}
|
||||||
|
|
||||||
public string DownstreamPathTemplate { get; set; }
|
public string DownstreamPathTemplate { get; set; }
|
||||||
public string UpstreamTemplate { get; set; }
|
public string UpstreamPathTemplate { get; set; }
|
||||||
public string UpstreamHttpMethod { get; set; }
|
public string UpstreamHttpMethod { get; set; }
|
||||||
public FileAuthenticationOptions AuthenticationOptions { get; set; }
|
public FileAuthenticationOptions AuthenticationOptions { get; set; }
|
||||||
public Dictionary<string, string> AddHeadersToRequest { get; set; }
|
public Dictionary<string, string> AddHeadersToRequest { get; set; }
|
||||||
|
@ -1,23 +1,34 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Net.Http;
|
||||||
using Ocelot.Values;
|
using Ocelot.Values;
|
||||||
|
|
||||||
namespace Ocelot.Configuration
|
namespace Ocelot.Configuration
|
||||||
{
|
{
|
||||||
public class ReRoute
|
public class ReRoute
|
||||||
{
|
{
|
||||||
public ReRoute(DownstreamPathTemplate downstreamPathTemplate,
|
public ReRoute(PathTemplate downstreamPathTemplate,
|
||||||
string upstreamTemplate, string upstreamHttpMethod,
|
PathTemplate upstreamTemplate,
|
||||||
|
HttpMethod upstreamHttpMethod,
|
||||||
string upstreamTemplatePattern,
|
string upstreamTemplatePattern,
|
||||||
bool isAuthenticated, AuthenticationOptions authenticationOptions,
|
bool isAuthenticated,
|
||||||
|
AuthenticationOptions authenticationOptions,
|
||||||
List<ClaimToThing> configurationHeaderExtractorProperties,
|
List<ClaimToThing> configurationHeaderExtractorProperties,
|
||||||
List<ClaimToThing> claimsToClaims,
|
List<ClaimToThing> claimsToClaims,
|
||||||
Dictionary<string, string> routeClaimsRequirement, bool isAuthorised,
|
Dictionary<string, string> routeClaimsRequirement,
|
||||||
|
bool isAuthorised,
|
||||||
List<ClaimToThing> claimsToQueries,
|
List<ClaimToThing> claimsToQueries,
|
||||||
string requestIdKey, bool isCached, CacheOptions fileCacheOptions,
|
string requestIdKey,
|
||||||
string downstreamScheme, string loadBalancer, string downstreamHost,
|
bool isCached,
|
||||||
int downstreamPort, string loadBalancerKey, ServiceProviderConfiguraion serviceProviderConfiguraion,
|
CacheOptions fileCacheOptions,
|
||||||
bool isQos,QoSOptions qos)
|
string downstreamScheme,
|
||||||
|
string loadBalancer,
|
||||||
|
string downstreamHost,
|
||||||
|
int downstreamPort,
|
||||||
|
string loadBalancerKey,
|
||||||
|
ServiceProviderConfiguraion serviceProviderConfiguraion,
|
||||||
|
bool isQos,
|
||||||
|
QoSOptions qos)
|
||||||
{
|
{
|
||||||
LoadBalancerKey = loadBalancerKey;
|
LoadBalancerKey = loadBalancerKey;
|
||||||
ServiceProviderConfiguraion = serviceProviderConfiguraion;
|
ServiceProviderConfiguraion = serviceProviderConfiguraion;
|
||||||
@ -25,7 +36,7 @@ namespace Ocelot.Configuration
|
|||||||
DownstreamHost = downstreamHost;
|
DownstreamHost = downstreamHost;
|
||||||
DownstreamPort = downstreamPort;
|
DownstreamPort = downstreamPort;
|
||||||
DownstreamPathTemplate = downstreamPathTemplate;
|
DownstreamPathTemplate = downstreamPathTemplate;
|
||||||
UpstreamTemplate = upstreamTemplate;
|
UpstreamPathTemplate = upstreamTemplate;
|
||||||
UpstreamHttpMethod = upstreamHttpMethod;
|
UpstreamHttpMethod = upstreamHttpMethod;
|
||||||
UpstreamTemplatePattern = upstreamTemplatePattern;
|
UpstreamTemplatePattern = upstreamTemplatePattern;
|
||||||
IsAuthenticated = isAuthenticated;
|
IsAuthenticated = isAuthenticated;
|
||||||
@ -47,10 +58,10 @@ namespace Ocelot.Configuration
|
|||||||
}
|
}
|
||||||
|
|
||||||
public string LoadBalancerKey {get;private set;}
|
public string LoadBalancerKey {get;private set;}
|
||||||
public DownstreamPathTemplate DownstreamPathTemplate { get; private set; }
|
public PathTemplate DownstreamPathTemplate { get; private set; }
|
||||||
public string UpstreamTemplate { get; private set; }
|
public PathTemplate UpstreamPathTemplate { get; private set; }
|
||||||
public string UpstreamTemplatePattern { get; private set; }
|
public string UpstreamTemplatePattern { get; private set; }
|
||||||
public string UpstreamHttpMethod { get; private set; }
|
public HttpMethod UpstreamHttpMethod { get; private set; }
|
||||||
public bool IsAuthenticated { get; private set; }
|
public bool IsAuthenticated { get; private set; }
|
||||||
public bool IsAuthorised { get; private set; }
|
public bool IsAuthorised { get; private set; }
|
||||||
public AuthenticationOptions AuthenticationOptions { get; private set; }
|
public AuthenticationOptions AuthenticationOptions { get; private set; }
|
||||||
|
@ -54,7 +54,7 @@ namespace Ocelot.Configuration.Validator
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var error = new UnsupportedAuthenticationProviderError($"{reRoute.AuthenticationOptions?.Provider} is unsupported authentication provider, upstream template is {reRoute.UpstreamTemplate}, upstream method is {reRoute.UpstreamHttpMethod}");
|
var error = new UnsupportedAuthenticationProviderError($"{reRoute.AuthenticationOptions?.Provider} is unsupported authentication provider, upstream template is {reRoute.UpstreamPathTemplate}, upstream method is {reRoute.UpstreamHttpMethod}");
|
||||||
errors.Add(error);
|
errors.Add(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,18 +94,18 @@ namespace Ocelot.Configuration.Validator
|
|||||||
private ConfigurationValidationResult CheckForDupliateReRoutes(FileConfiguration configuration)
|
private ConfigurationValidationResult CheckForDupliateReRoutes(FileConfiguration configuration)
|
||||||
{
|
{
|
||||||
var hasDupes = configuration.ReRoutes
|
var hasDupes = configuration.ReRoutes
|
||||||
.GroupBy(x => new { x.UpstreamTemplate, x.UpstreamHttpMethod }).Any(x => x.Skip(1).Any());
|
.GroupBy(x => new { x.UpstreamPathTemplate, x.UpstreamHttpMethod }).Any(x => x.Skip(1).Any());
|
||||||
|
|
||||||
if (!hasDupes)
|
if (!hasDupes)
|
||||||
{
|
{
|
||||||
return new ConfigurationValidationResult(false);
|
return new ConfigurationValidationResult(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
var dupes = configuration.ReRoutes.GroupBy(x => new { x.UpstreamTemplate, x.UpstreamHttpMethod })
|
var dupes = configuration.ReRoutes.GroupBy(x => new { x.UpstreamPathTemplate, x.UpstreamHttpMethod })
|
||||||
.Where(x => x.Skip(1).Any());
|
.Where(x => x.Skip(1).Any());
|
||||||
|
|
||||||
var errors = dupes
|
var errors = dupes
|
||||||
.Select(d => new DownstreamPathTemplateAlreadyUsedError(string.Format("Duplicate DownstreamPath: {0}", d.Key.UpstreamTemplate)))
|
.Select(d => new DownstreamPathTemplateAlreadyUsedError(string.Format("Duplicate DownstreamPath: {0}", d.Key.UpstreamPathTemplate)))
|
||||||
.Cast<Error>()
|
.Cast<Error>()
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ namespace Ocelot.DownstreamRouteFinder.Finder
|
|||||||
{
|
{
|
||||||
var configuration = await _configProvider.Get();
|
var configuration = await _configProvider.Get();
|
||||||
|
|
||||||
var applicableReRoutes = configuration.Data.ReRoutes.Where(r => string.Equals(r.UpstreamHttpMethod, upstreamHttpMethod, StringComparison.CurrentCultureIgnoreCase));
|
var applicableReRoutes = configuration.Data.ReRoutes.Where(r => string.Equals(r.UpstreamHttpMethod.Method, upstreamHttpMethod, StringComparison.CurrentCultureIgnoreCase));
|
||||||
|
|
||||||
foreach (var reRoute in applicableReRoutes)
|
foreach (var reRoute in applicableReRoutes)
|
||||||
{
|
{
|
||||||
@ -34,7 +34,7 @@ namespace Ocelot.DownstreamRouteFinder.Finder
|
|||||||
|
|
||||||
if (urlMatch.Data.Match)
|
if (urlMatch.Data.Match)
|
||||||
{
|
{
|
||||||
var templateVariableNameAndValues = _urlPathPlaceholderNameAndValueFinder.Find(upstreamUrlPath, reRoute.UpstreamTemplate);
|
var templateVariableNameAndValues = _urlPathPlaceholderNameAndValueFinder.Find(upstreamUrlPath, reRoute.UpstreamPathTemplate.Value);
|
||||||
|
|
||||||
return new OkResponse<DownstreamRoute>(new DownstreamRoute(templateVariableNameAndValues.Data, reRoute));
|
return new OkResponse<DownstreamRoute>(new DownstreamRoute(templateVariableNameAndValues.Data, reRoute));
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ namespace Ocelot.DownstreamUrlCreator.UrlTemplateReplacer
|
|||||||
{
|
{
|
||||||
public class DownstreamTemplatePathPlaceholderReplacer : IDownstreamPathPlaceholderReplacer
|
public class DownstreamTemplatePathPlaceholderReplacer : IDownstreamPathPlaceholderReplacer
|
||||||
{
|
{
|
||||||
public Response<DownstreamPath> Replace(DownstreamPathTemplate downstreamPathTemplate, List<UrlPathPlaceholderNameAndValue> urlPathPlaceholderNameAndValues)
|
public Response<DownstreamPath> Replace(PathTemplate downstreamPathTemplate, List<UrlPathPlaceholderNameAndValue> urlPathPlaceholderNameAndValues)
|
||||||
{
|
{
|
||||||
var downstreamPath = new StringBuilder();
|
var downstreamPath = new StringBuilder();
|
||||||
|
|
||||||
|
@ -7,6 +7,6 @@ namespace Ocelot.DownstreamUrlCreator.UrlTemplateReplacer
|
|||||||
{
|
{
|
||||||
public interface IDownstreamPathPlaceholderReplacer
|
public interface IDownstreamPathPlaceholderReplacer
|
||||||
{
|
{
|
||||||
Response<DownstreamPath> Replace(DownstreamPathTemplate downstreamPathTemplate, List<UrlPathPlaceholderNameAndValue> urlPathPlaceholderNameAndValues);
|
Response<DownstreamPath> Replace(PathTemplate downstreamPathTemplate, List<UrlPathPlaceholderNameAndValue> urlPathPlaceholderNameAndValues);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -14,16 +14,7 @@ namespace Ocelot.LoadBalancer.LoadBalancers
|
|||||||
|
|
||||||
public async Task<ILoadBalancer> Get(ReRoute reRoute)
|
public async Task<ILoadBalancer> Get(ReRoute reRoute)
|
||||||
{
|
{
|
||||||
var serviceConfig = new ServiceProviderConfiguraion(
|
var serviceProvider = _serviceProviderFactory.Get(reRoute.ServiceProviderConfiguraion);
|
||||||
reRoute.ServiceProviderConfiguraion.ServiceName,
|
|
||||||
reRoute.ServiceProviderConfiguraion.DownstreamHost,
|
|
||||||
reRoute.ServiceProviderConfiguraion.DownstreamPort,
|
|
||||||
reRoute.ServiceProviderConfiguraion.UseServiceDiscovery,
|
|
||||||
reRoute.ServiceProviderConfiguraion.ServiceDiscoveryProvider,
|
|
||||||
reRoute.ServiceProviderConfiguraion.ServiceProviderHost,
|
|
||||||
reRoute.ServiceProviderConfiguraion.ServiceProviderPort);
|
|
||||||
|
|
||||||
var serviceProvider = _serviceProviderFactory.Get(serviceConfig);
|
|
||||||
|
|
||||||
switch (reRoute.LoadBalancer)
|
switch (reRoute.LoadBalancer)
|
||||||
{
|
{
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
namespace Ocelot.Values
|
namespace Ocelot.Values
|
||||||
{
|
{
|
||||||
public class DownstreamPathTemplate
|
public class PathTemplate
|
||||||
{
|
{
|
||||||
public DownstreamPathTemplate(string value)
|
public PathTemplate(string value)
|
||||||
{
|
{
|
||||||
Value = value;
|
Value = value;
|
||||||
}
|
}
|
||||||
|
BIN
test/.DS_Store
vendored
BIN
test/.DS_Store
vendored
Binary file not shown.
@ -47,7 +47,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = _downstreamServicePort,
|
DownstreamPort = _downstreamServicePort,
|
||||||
DownstreamHost = _downstreamServiceHost,
|
DownstreamHost = _downstreamServiceHost,
|
||||||
DownstreamScheme = _downstreamServiceScheme,
|
DownstreamScheme = _downstreamServiceScheme,
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Post",
|
UpstreamHttpMethod = "Post",
|
||||||
AuthenticationOptions = new FileAuthenticationOptions
|
AuthenticationOptions = new FileAuthenticationOptions
|
||||||
{
|
{
|
||||||
@ -85,7 +85,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = _downstreamServicePort,
|
DownstreamPort = _downstreamServicePort,
|
||||||
DownstreamHost = _downstreamServiceHost,
|
DownstreamHost = _downstreamServiceHost,
|
||||||
DownstreamScheme = _downstreamServiceScheme,
|
DownstreamScheme = _downstreamServiceScheme,
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Post",
|
UpstreamHttpMethod = "Post",
|
||||||
AuthenticationOptions = new FileAuthenticationOptions
|
AuthenticationOptions = new FileAuthenticationOptions
|
||||||
{
|
{
|
||||||
@ -123,7 +123,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = _downstreamServicePort,
|
DownstreamPort = _downstreamServicePort,
|
||||||
DownstreamHost = _downstreamServiceHost,
|
DownstreamHost = _downstreamServiceHost,
|
||||||
DownstreamScheme = _downstreamServiceScheme,
|
DownstreamScheme = _downstreamServiceScheme,
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
AuthenticationOptions = new FileAuthenticationOptions
|
AuthenticationOptions = new FileAuthenticationOptions
|
||||||
{
|
{
|
||||||
@ -163,7 +163,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = _downstreamServicePort,
|
DownstreamPort = _downstreamServicePort,
|
||||||
DownstreamHost = _downstreamServiceHost,
|
DownstreamHost = _downstreamServiceHost,
|
||||||
DownstreamScheme = _downstreamServiceScheme,
|
DownstreamScheme = _downstreamServiceScheme,
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Post",
|
UpstreamHttpMethod = "Post",
|
||||||
|
|
||||||
AuthenticationOptions = new FileAuthenticationOptions
|
AuthenticationOptions = new FileAuthenticationOptions
|
||||||
@ -204,7 +204,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = _downstreamServicePort,
|
DownstreamPort = _downstreamServicePort,
|
||||||
DownstreamHost = _downstreamServiceHost,
|
DownstreamHost = _downstreamServiceHost,
|
||||||
DownstreamScheme = _downstreamServiceScheme,
|
DownstreamScheme = _downstreamServiceScheme,
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Post",
|
UpstreamHttpMethod = "Post",
|
||||||
AuthenticationOptions = new FileAuthenticationOptions
|
AuthenticationOptions = new FileAuthenticationOptions
|
||||||
{
|
{
|
||||||
|
@ -41,7 +41,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 51876,
|
DownstreamPort = 51876,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
AuthenticationOptions = new FileAuthenticationOptions
|
AuthenticationOptions = new FileAuthenticationOptions
|
||||||
{
|
{
|
||||||
@ -98,7 +98,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 51876,
|
DownstreamPort = 51876,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
AuthenticationOptions = new FileAuthenticationOptions
|
AuthenticationOptions = new FileAuthenticationOptions
|
||||||
{
|
{
|
||||||
|
@ -35,7 +35,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
FileCacheOptions = new FileCacheOptions
|
FileCacheOptions = new FileCacheOptions
|
||||||
{
|
{
|
||||||
@ -71,7 +71,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
FileCacheOptions = new FileCacheOptions
|
FileCacheOptions = new FileCacheOptions
|
||||||
{
|
{
|
||||||
|
@ -34,7 +34,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/products/{productId}",
|
UpstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -61,7 +61,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/products/{productId}",
|
UpstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = false,
|
ReRouteIsCaseSensitive = false,
|
||||||
}
|
}
|
||||||
@ -89,7 +89,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/products/{productId}",
|
UpstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = true,
|
ReRouteIsCaseSensitive = true,
|
||||||
}
|
}
|
||||||
@ -117,7 +117,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/PRODUCTS/{productId}",
|
UpstreamPathTemplate = "/PRODUCTS/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = true,
|
ReRouteIsCaseSensitive = true,
|
||||||
}
|
}
|
||||||
@ -145,7 +145,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/products/{productId}",
|
UpstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = true,
|
ReRouteIsCaseSensitive = true,
|
||||||
}
|
}
|
||||||
@ -173,7 +173,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/PRODUCTS/{productId}",
|
UpstreamPathTemplate = "/PRODUCTS/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = true,
|
ReRouteIsCaseSensitive = true,
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 52876,
|
DownstreamPort = 52876,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
AuthenticationOptions = new FileAuthenticationOptions
|
AuthenticationOptions = new FileAuthenticationOptions
|
||||||
{
|
{
|
||||||
|
@ -55,7 +55,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 57876,
|
DownstreamPort = 57876,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
AuthenticationOptions = new FileAuthenticationOptions
|
AuthenticationOptions = new FileAuthenticationOptions
|
||||||
{
|
{
|
||||||
|
@ -49,7 +49,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 41879,
|
DownstreamPort = 41879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -86,7 +86,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 41879,
|
DownstreamPort = 41879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -124,7 +124,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 41879,
|
DownstreamPort = 41879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -162,7 +162,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 41879,
|
DownstreamPort = 41879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -199,7 +199,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 41879,
|
DownstreamPort = 41879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -236,7 +236,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 41879,
|
DownstreamPort = 41879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
RequestIdKey = _steps.RequestIdKey,
|
RequestIdKey = _steps.RequestIdKey,
|
||||||
}
|
}
|
||||||
@ -65,7 +65,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -95,8 +95,8 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod ="Get"
|
UpstreamHttpMethod = "Get",
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
GlobalConfiguration = new FileGlobalConfiguration
|
GlobalConfiguration = new FileGlobalConfiguration
|
||||||
|
@ -30,7 +30,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
DownstreamPathTemplate = "http://localhost:53876/",
|
DownstreamPathTemplate = "http://localhost:53876/",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get"
|
UpstreamHttpMethod = "Get"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -73,7 +73,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -102,7 +102,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost/",
|
DownstreamHost = "localhost/",
|
||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -131,7 +131,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
UpstreamTemplate = "/products/",
|
UpstreamPathTemplate = "/products/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -160,9 +160,8 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
UpstreamTemplate = "/products",
|
UpstreamPathTemplate = "/products",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -182,22 +181,23 @@ namespace Ocelot.AcceptanceTests
|
|||||||
var configuration = new FileConfiguration
|
var configuration = new FileConfiguration
|
||||||
{
|
{
|
||||||
ReRoutes = new List<FileReRoute>
|
ReRoutes = new List<FileReRoute>
|
||||||
|
{
|
||||||
|
new FileReRoute
|
||||||
{
|
{
|
||||||
new FileReRoute
|
DownstreamPathTemplate = "/products",
|
||||||
|
DownstreamScheme = "http",
|
||||||
|
DownstreamHost = "localhost",
|
||||||
|
DownstreamPort = 51879,
|
||||||
|
UpstreamPathTemplate = "/products/{productId}",
|
||||||
|
UpstreamHttpMethod = "Get",
|
||||||
|
QoSOptions = new FileQoSOptions()
|
||||||
{
|
{
|
||||||
DownstreamPathTemplate = "/products",
|
|
||||||
DownstreamScheme = "http",
|
|
||||||
DownstreamHost = "localhost",
|
|
||||||
DownstreamPort = 51879,
|
|
||||||
UpstreamTemplate = "/products/{productId}",
|
|
||||||
UpstreamHttpMethod = "Get",
|
|
||||||
QoSOptions = new FileQoSOptions()
|
|
||||||
{
|
|
||||||
ExceptionsAllowedBeforeBreaking = 3,
|
ExceptionsAllowedBeforeBreaking = 3,
|
||||||
DurationOfBreak =5,
|
DurationOfBreak = 5,
|
||||||
TimeoutValue = 5000 }
|
TimeoutValue = 5000
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.Given(x => x.GivenThereIsAServiceRunningOn("http://localhost:51879/products", 200, "Hello from Laura"))
|
this.Given(x => x.GivenThereIsAServiceRunningOn("http://localhost:51879/products", 200, "Hello from Laura"))
|
||||||
@ -221,7 +221,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
UpstreamTemplate = "/products/{productId}",
|
UpstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -249,7 +249,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Post",
|
UpstreamHttpMethod = "Post",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -274,7 +274,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
DownstreamPathTemplate = "/newThing",
|
DownstreamPathTemplate = "/newThing",
|
||||||
UpstreamTemplate = "/newThing",
|
UpstreamPathTemplate = "/newThing",
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
DownstreamHost = "localhost",
|
DownstreamHost = "localhost",
|
||||||
DownstreamPort = 51879,
|
DownstreamPort = 51879,
|
||||||
|
@ -68,7 +68,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
{
|
{
|
||||||
DownstreamPathTemplate = "/",
|
DownstreamPathTemplate = "/",
|
||||||
DownstreamScheme = "http",
|
DownstreamScheme = "http",
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ServiceName = serviceName,
|
ServiceName = serviceName,
|
||||||
LoadBalancer = "LeastConnection",
|
LoadBalancer = "LeastConnection",
|
||||||
|
@ -1 +0,0 @@
|
|||||||
{"ReRoutes":[{"DownstreamPathTemplate":"41879/","UpstreamTemplate":"/","UpstreamHttpMethod":"Get","AuthenticationOptions":{"Provider":null,"ProviderRootUrl":null,"ScopeName":null,"RequireHttps":false,"AdditionalScopes":[],"ScopeSecret":null},"AddHeadersToRequest":{},"AddClaimsToRequest":{},"RouteClaimsRequirement":{},"AddQueriesToRequest":{},"RequestIdKey":null,"FileCacheOptions":{"TtlSeconds":0},"ReRouteIsCaseSensitive":false,"ServiceName":null,"DownstreamScheme":"http","DownstreamHost":"localhost","DownstreamPort":41879,"QoSOptions":{"ExceptionsAllowedBeforeBreaking":0,"DurationOfBreak":0,"TimeoutValue":0},"LoadBalancer":null}],"GlobalConfiguration":{"RequestIdKey":null,"ServiceDiscoveryProvider":{"Provider":null,"Host":null,"Port":0}}}
|
|
@ -6,6 +6,7 @@ using Moq;
|
|||||||
using Ocelot.Authentication.Handler;
|
using Ocelot.Authentication.Handler;
|
||||||
using Ocelot.Authentication.Handler.Creator;
|
using Ocelot.Authentication.Handler.Creator;
|
||||||
using Ocelot.Authentication.Handler.Factory;
|
using Ocelot.Authentication.Handler.Factory;
|
||||||
|
using Ocelot.Configuration.Builder;
|
||||||
using Ocelot.Errors;
|
using Ocelot.Errors;
|
||||||
using Ocelot.Responses;
|
using Ocelot.Responses;
|
||||||
using Shouldly;
|
using Shouldly;
|
||||||
@ -33,7 +34,11 @@ namespace Ocelot.UnitTests.Authentication
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void should_return_identity_server_access_token_handler()
|
public void should_return_identity_server_access_token_handler()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenTheAuthenticationOptionsAre(new AuthenticationOptions("IdentityServer", "","",false, new List<string>(), "")))
|
var authenticationOptions = new AuthenticationOptionsBuilder()
|
||||||
|
.WithProvider("IdentityServer")
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
this.Given(x => x.GivenTheAuthenticationOptionsAre(authenticationOptions))
|
||||||
.And(x => x.GivenTheCreatorReturns())
|
.And(x => x.GivenTheCreatorReturns())
|
||||||
.When(x => x.WhenIGetFromTheFactory())
|
.When(x => x.WhenIGetFromTheFactory())
|
||||||
.Then(x => x.ThenTheHandlerIsReturned("IdentityServer"))
|
.Then(x => x.ThenTheHandlerIsReturned("IdentityServer"))
|
||||||
@ -43,7 +48,10 @@ namespace Ocelot.UnitTests.Authentication
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void should_return_error_if_cannot_create_handler()
|
public void should_return_error_if_cannot_create_handler()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenTheAuthenticationOptionsAre(new AuthenticationOptions("IdentityServer", "", "", false, new List<string>(), "")))
|
var authenticationOptions = new AuthenticationOptionsBuilder()
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
this.Given(x => x.GivenTheAuthenticationOptionsAre(authenticationOptions))
|
||||||
.And(x => x.GivenTheCreatorReturnsAnError())
|
.And(x => x.GivenTheCreatorReturnsAnError())
|
||||||
.When(x => x.WhenIGetFromTheFactory())
|
.When(x => x.WhenIGetFromTheFactory())
|
||||||
.Then(x => x.ThenAnErrorResponseIsReturned())
|
.Then(x => x.ThenAnErrorResponseIsReturned())
|
||||||
@ -58,7 +66,7 @@ namespace Ocelot.UnitTests.Authentication
|
|||||||
private void GivenTheCreatorReturnsAnError()
|
private void GivenTheCreatorReturnsAnError()
|
||||||
{
|
{
|
||||||
_creator
|
_creator
|
||||||
.Setup(x => x.CreateIdentityServerAuthenticationHandler(It.IsAny<IApplicationBuilder>(), It.IsAny<AuthenticationOptions>()))
|
.Setup(x => x.Create(It.IsAny<IApplicationBuilder>(), It.IsAny<AuthenticationOptions>()))
|
||||||
.Returns(new ErrorResponse<RequestDelegate>(new List<Error>
|
.Returns(new ErrorResponse<RequestDelegate>(new List<Error>
|
||||||
{
|
{
|
||||||
new UnableToCreateAuthenticationHandlerError($"Unable to create authentication handler for xxx")
|
new UnableToCreateAuthenticationHandlerError($"Unable to create authentication handler for xxx")
|
||||||
@ -68,7 +76,7 @@ namespace Ocelot.UnitTests.Authentication
|
|||||||
private void GivenTheCreatorReturns()
|
private void GivenTheCreatorReturns()
|
||||||
{
|
{
|
||||||
_creator
|
_creator
|
||||||
.Setup(x => x.CreateIdentityServerAuthenticationHandler(It.IsAny<IApplicationBuilder>(), It.IsAny<AuthenticationOptions>()))
|
.Setup(x => x.Create(It.IsAny<IApplicationBuilder>(), It.IsAny<AuthenticationOptions>()))
|
||||||
.Returns(new OkResponse<RequestDelegate>(x => Task.CompletedTask));
|
.Returns(new OkResponse<RequestDelegate>(x => Task.CompletedTask));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +71,9 @@ namespace Ocelot.UnitTests.Authentication
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void should_call_next_middleware_if_route_is_not_authenticated()
|
public void should_call_next_middleware_if_route_is_not_authenticated()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenTheDownStreamRouteIs(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(), new ReRouteBuilder().Build())))
|
this.Given(x => x.GivenTheDownStreamRouteIs(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(), new ReRouteBuilder()
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build())))
|
||||||
.When(x => x.WhenICallTheMiddleware())
|
.When(x => x.WhenICallTheMiddleware())
|
||||||
.Then(x => x.ThenTheUserIsAuthenticated())
|
.Then(x => x.ThenTheUserIsAuthenticated())
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
|
@ -63,7 +63,11 @@ namespace Ocelot.UnitTests.Authorization
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void should_call_authorisation_service()
|
public void should_call_authorisation_service()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenTheDownStreamRouteIs(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(), new ReRouteBuilder().WithIsAuthorised(true).Build())))
|
this.Given(x => x.GivenTheDownStreamRouteIs(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
||||||
|
new ReRouteBuilder()
|
||||||
|
.WithIsAuthorised(true)
|
||||||
|
.WithUpstreamHttpMethod("Get") .WithUpstreamHttpMethod("Get")
|
||||||
|
.Build())))
|
||||||
.And(x => x.GivenTheAuthServiceReturns(new OkResponse<bool>(true)))
|
.And(x => x.GivenTheAuthServiceReturns(new OkResponse<bool>(true)))
|
||||||
.When(x => x.WhenICallTheMiddleware())
|
.When(x => x.WhenICallTheMiddleware())
|
||||||
.Then(x => x.ThenTheAuthServiceIsCalledCorrectly())
|
.Then(x => x.ThenTheAuthServiceIsCalledCorrectly())
|
||||||
|
@ -87,7 +87,12 @@ namespace Ocelot.UnitTests.Cache
|
|||||||
|
|
||||||
private void GivenTheDownstreamRouteIs()
|
private void GivenTheDownstreamRouteIs()
|
||||||
{
|
{
|
||||||
var reRoute = new ReRouteBuilder().WithIsCached(true).WithCacheOptions(new CacheOptions(100)).Build();
|
var reRoute = new ReRouteBuilder()
|
||||||
|
.WithIsCached(true)
|
||||||
|
.WithCacheOptions(new CacheOptions(100))
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build();
|
||||||
|
|
||||||
var downstreamRoute = new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(), reRoute);
|
var downstreamRoute = new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(), reRoute);
|
||||||
|
|
||||||
_scopedRepo
|
_scopedRepo
|
||||||
|
@ -72,6 +72,7 @@ namespace Ocelot.UnitTests.Claims
|
|||||||
{
|
{
|
||||||
new ClaimToThing("sub", "UserType", "|", 0)
|
new ClaimToThing("sub", "UserType", "|", 0)
|
||||||
})
|
})
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
.Build());
|
.Build());
|
||||||
|
|
||||||
this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute))
|
this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute))
|
||||||
|
@ -29,7 +29,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
DownstreamPathTemplate = "http://www.bbc.co.uk/api/products/{productId}",
|
DownstreamPathTemplate = "http://www.bbc.co.uk/api/products/{productId}",
|
||||||
UpstreamTemplate = "http://asdf.com"
|
UpstreamPathTemplate = "http://asdf.com"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
@ -48,7 +48,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
DownstreamPathTemplate = "/api/products/",
|
DownstreamPathTemplate = "/api/products/",
|
||||||
UpstreamTemplate = "http://asdf.com"
|
UpstreamPathTemplate = "http://asdf.com"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
@ -67,7 +67,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
DownstreamPathTemplate = "/api/products/",
|
DownstreamPathTemplate = "/api/products/",
|
||||||
UpstreamTemplate = "http://asdf.com",
|
UpstreamPathTemplate = "http://asdf.com",
|
||||||
AuthenticationOptions = new FileAuthenticationOptions
|
AuthenticationOptions = new FileAuthenticationOptions
|
||||||
{
|
{
|
||||||
Provider = "IdentityServer"
|
Provider = "IdentityServer"
|
||||||
@ -90,7 +90,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
DownstreamPathTemplate = "/api/products/",
|
DownstreamPathTemplate = "/api/products/",
|
||||||
UpstreamTemplate = "http://asdf.com",
|
UpstreamPathTemplate = "http://asdf.com",
|
||||||
AuthenticationOptions = new FileAuthenticationOptions
|
AuthenticationOptions = new FileAuthenticationOptions
|
||||||
{
|
{
|
||||||
Provider = "BootyBootyBottyRockinEverywhere"
|
Provider = "BootyBootyBottyRockinEverywhere"
|
||||||
@ -114,12 +114,12 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
DownstreamPathTemplate = "/api/products/",
|
DownstreamPathTemplate = "/api/products/",
|
||||||
UpstreamTemplate = "http://asdf.com"
|
UpstreamPathTemplate = "http://asdf.com"
|
||||||
},
|
},
|
||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
DownstreamPathTemplate = "http://www.bbc.co.uk",
|
DownstreamPathTemplate = "http://www.bbc.co.uk",
|
||||||
UpstreamTemplate = "http://asdf.com"
|
UpstreamPathTemplate = "http://asdf.com"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
|
@ -53,7 +53,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
DownstreamHost = "127.0.0.1",
|
DownstreamHost = "127.0.0.1",
|
||||||
UpstreamTemplate = "/api/products/{productId}",
|
UpstreamPathTemplate = "/api/products/{productId}",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
}
|
}
|
||||||
@ -78,7 +78,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
DownstreamHost = "127.0.0.1",
|
DownstreamHost = "127.0.0.1",
|
||||||
UpstreamTemplate = "/api/products/{productId}",
|
UpstreamPathTemplate = "/api/products/{productId}",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
}
|
}
|
||||||
@ -91,7 +91,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamHost("127.0.0.1")
|
.WithDownstreamHost("127.0.0.1")
|
||||||
.WithDownstreamPathTemplate("/products/{productId}")
|
.WithDownstreamPathTemplate("/products/{productId}")
|
||||||
.WithUpstreamTemplate("/api/products/{productId}")
|
.WithUpstreamPathTemplate("/api/products/{productId}")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("(?i)/api/products/.*/$")
|
.WithUpstreamTemplatePattern("(?i)/api/products/.*/$")
|
||||||
.Build()
|
.Build()
|
||||||
@ -109,7 +109,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
DownstreamScheme = "https",
|
DownstreamScheme = "https",
|
||||||
UpstreamTemplate = "/api/products/{productId}",
|
UpstreamPathTemplate = "/api/products/{productId}",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
}
|
}
|
||||||
@ -122,7 +122,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamScheme("https")
|
.WithDownstreamScheme("https")
|
||||||
.WithDownstreamPathTemplate("/products/{productId}")
|
.WithDownstreamPathTemplate("/products/{productId}")
|
||||||
.WithUpstreamTemplate("/api/products/{productId}")
|
.WithUpstreamPathTemplate("/api/products/{productId}")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("(?i)/api/products/.*/$")
|
.WithUpstreamTemplatePattern("(?i)/api/products/.*/$")
|
||||||
.Build()
|
.Build()
|
||||||
@ -139,7 +139,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
UpstreamTemplate = "/api/products/{productId}",
|
UpstreamPathTemplate = "/api/products/{productId}",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = false,
|
ReRouteIsCaseSensitive = false,
|
||||||
@ -161,13 +161,15 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("/products/{productId}")
|
.WithDownstreamPathTemplate("/products/{productId}")
|
||||||
.WithUpstreamTemplate("/api/products/{productId}")
|
.WithUpstreamPathTemplate("/api/products/{productId}")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("(?i)/api/products/.*/$")
|
.WithUpstreamTemplatePattern("(?i)/api/products/.*/$")
|
||||||
.WithServiceName("ProductService")
|
.WithServiceName("ProductService")
|
||||||
.WithUseServiceDiscovery(true)
|
.WithServiceProviderConfiguraion(new ServiceProviderConfiguraionBuilder()
|
||||||
.WithServiceDiscoveryProvider("consul")
|
.WithUseServiceDiscovery(true)
|
||||||
.WithServiceDiscoveryAddress("127.0.01")
|
.WithServiceDiscoveryProvider("consul")
|
||||||
|
.WithServiceDiscoveryProviderHost("127.0.0.1")
|
||||||
|
.Build())
|
||||||
.Build()
|
.Build()
|
||||||
}))
|
}))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -182,7 +184,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
UpstreamTemplate = "/api/products/{productId}",
|
UpstreamPathTemplate = "/api/products/{productId}",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = false,
|
ReRouteIsCaseSensitive = false,
|
||||||
@ -195,12 +197,12 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("/products/{productId}")
|
.WithDownstreamPathTemplate("/products/{productId}")
|
||||||
.WithUpstreamTemplate("/api/products/{productId}")
|
.WithUpstreamPathTemplate("/api/products/{productId}")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("(?i)/api/products/.*/$")
|
.WithUpstreamTemplatePattern("(?i)/api/products/.*/$")
|
||||||
.WithUseServiceDiscovery(false)
|
.WithServiceProviderConfiguraion(new ServiceProviderConfiguraionBuilder()
|
||||||
.WithServiceDiscoveryProvider(null)
|
.WithUseServiceDiscovery(false)
|
||||||
.WithServiceDiscoveryAddress(null)
|
.Build())
|
||||||
.Build()
|
.Build()
|
||||||
}))
|
}))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -215,7 +217,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
UpstreamTemplate = "/api/products/{productId}",
|
UpstreamPathTemplate = "/api/products/{productId}",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = false
|
ReRouteIsCaseSensitive = false
|
||||||
@ -228,7 +230,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("/products/{productId}")
|
.WithDownstreamPathTemplate("/products/{productId}")
|
||||||
.WithUpstreamTemplate("/api/products/{productId}")
|
.WithUpstreamPathTemplate("/api/products/{productId}")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("(?i)/api/products/.*/$")
|
.WithUpstreamTemplatePattern("(?i)/api/products/.*/$")
|
||||||
.Build()
|
.Build()
|
||||||
@ -245,7 +247,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
UpstreamTemplate = "/api/products/{productId}",
|
UpstreamPathTemplate = "/api/products/{productId}",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get"
|
UpstreamHttpMethod = "Get"
|
||||||
}
|
}
|
||||||
@ -257,7 +259,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("/products/{productId}")
|
.WithDownstreamPathTemplate("/products/{productId}")
|
||||||
.WithUpstreamTemplate("/api/products/{productId}")
|
.WithUpstreamPathTemplate("/api/products/{productId}")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("(?i)/api/products/.*/$")
|
.WithUpstreamTemplatePattern("(?i)/api/products/.*/$")
|
||||||
.Build()
|
.Build()
|
||||||
@ -274,7 +276,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
UpstreamTemplate = "/api/products/{productId}",
|
UpstreamPathTemplate = "/api/products/{productId}",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = true
|
ReRouteIsCaseSensitive = true
|
||||||
@ -287,7 +289,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("/products/{productId}")
|
.WithDownstreamPathTemplate("/products/{productId}")
|
||||||
.WithUpstreamTemplate("/api/products/{productId}")
|
.WithUpstreamPathTemplate("/api/products/{productId}")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("/api/products/.*/$")
|
.WithUpstreamTemplatePattern("/api/products/.*/$")
|
||||||
.Build()
|
.Build()
|
||||||
@ -304,7 +306,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
UpstreamTemplate = "/api/products/{productId}",
|
UpstreamPathTemplate = "/api/products/{productId}",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = true
|
ReRouteIsCaseSensitive = true
|
||||||
@ -321,7 +323,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("/products/{productId}")
|
.WithDownstreamPathTemplate("/products/{productId}")
|
||||||
.WithUpstreamTemplate("/api/products/{productId}")
|
.WithUpstreamPathTemplate("/api/products/{productId}")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("/api/products/.*/$")
|
.WithUpstreamTemplatePattern("/api/products/.*/$")
|
||||||
.WithRequestIdKey("blahhhh")
|
.WithRequestIdKey("blahhhh")
|
||||||
@ -339,7 +341,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
UpstreamTemplate = "/api/products/{productId}",
|
UpstreamPathTemplate = "/api/products/{productId}",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = true
|
ReRouteIsCaseSensitive = true
|
||||||
@ -352,7 +354,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("/products/{productId}")
|
.WithDownstreamPathTemplate("/products/{productId}")
|
||||||
.WithUpstreamTemplate("/api/products/{productId}")
|
.WithUpstreamPathTemplate("/api/products/{productId}")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("/api/products/.*/$")
|
.WithUpstreamTemplatePattern("/api/products/.*/$")
|
||||||
.Build()
|
.Build()
|
||||||
@ -363,18 +365,23 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void should_create_with_headers_to_extract()
|
public void should_create_with_headers_to_extract()
|
||||||
{
|
{
|
||||||
|
var authenticationOptions = new AuthenticationOptionsBuilder()
|
||||||
|
.WithProvider("IdentityServer")
|
||||||
|
.WithProviderRootUrl("http://localhost:51888")
|
||||||
|
.WithRequireHttps(false)
|
||||||
|
.WithScopeSecret("secret")
|
||||||
|
.WithScopeName("api")
|
||||||
|
.WithAdditionalScopes(new List<string>())
|
||||||
|
.Build();
|
||||||
|
|
||||||
var expected = new List<ReRoute>
|
var expected = new List<ReRoute>
|
||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("/products/{productId}")
|
.WithDownstreamPathTemplate("/products/{productId}")
|
||||||
.WithUpstreamTemplate("/api/products/{productId}")
|
.WithUpstreamPathTemplate("/api/products/{productId}")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("/api/products/.*/$")
|
.WithUpstreamTemplatePattern("/api/products/.*/$")
|
||||||
.WithAuthenticationProvider("IdentityServer")
|
.WithAuthenticationOptions(authenticationOptions)
|
||||||
.WithAuthenticationProviderUrl("http://localhost:51888")
|
|
||||||
.WithRequireHttps(false)
|
|
||||||
.WithScopeSecret("secret")
|
|
||||||
.WithAuthenticationProviderScopeName("api")
|
|
||||||
.WithClaimsToHeaders(new List<ClaimToThing>
|
.WithClaimsToHeaders(new List<ClaimToThing>
|
||||||
{
|
{
|
||||||
new ClaimToThing("CustomerId", "CustomerId", "", 0),
|
new ClaimToThing("CustomerId", "CustomerId", "", 0),
|
||||||
@ -388,7 +395,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
UpstreamTemplate = "/api/products/{productId}",
|
UpstreamPathTemplate = "/api/products/{productId}",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = true,
|
ReRouteIsCaseSensitive = true,
|
||||||
@ -427,18 +434,23 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void should_create_with_authentication_properties()
|
public void should_create_with_authentication_properties()
|
||||||
{
|
{
|
||||||
|
var authenticationOptions = new AuthenticationOptionsBuilder()
|
||||||
|
.WithProvider("IdentityServer")
|
||||||
|
.WithProviderRootUrl("http://localhost:51888")
|
||||||
|
.WithRequireHttps(false)
|
||||||
|
.WithScopeSecret("secret")
|
||||||
|
.WithScopeName("api")
|
||||||
|
.WithAdditionalScopes(new List<string>())
|
||||||
|
.Build();
|
||||||
|
|
||||||
var expected = new List<ReRoute>
|
var expected = new List<ReRoute>
|
||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("/products/{productId}")
|
.WithDownstreamPathTemplate("/products/{productId}")
|
||||||
.WithUpstreamTemplate("/api/products/{productId}")
|
.WithUpstreamPathTemplate("/api/products/{productId}")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("/api/products/.*/$")
|
.WithUpstreamTemplatePattern("/api/products/.*/$")
|
||||||
.WithAuthenticationProvider("IdentityServer")
|
.WithAuthenticationOptions(authenticationOptions)
|
||||||
.WithAuthenticationProviderUrl("http://localhost:51888")
|
|
||||||
.WithRequireHttps(false)
|
|
||||||
.WithScopeSecret("secret")
|
|
||||||
.WithAuthenticationProviderScopeName("api")
|
|
||||||
.Build()
|
.Build()
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -448,7 +460,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
UpstreamTemplate = "/api/products/{productId}",
|
UpstreamPathTemplate = "/api/products/{productId}",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = true,
|
ReRouteIsCaseSensitive = true,
|
||||||
@ -481,7 +493,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
UpstreamTemplate = "/api/products/{productId}/variants/{variantId}",
|
UpstreamPathTemplate = "/api/products/{productId}/variants/{variantId}",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = true
|
ReRouteIsCaseSensitive = true
|
||||||
@ -494,7 +506,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("/products/{productId}")
|
.WithDownstreamPathTemplate("/products/{productId}")
|
||||||
.WithUpstreamTemplate("/api/products/{productId}/variants/{variantId}")
|
.WithUpstreamPathTemplate("/api/products/{productId}/variants/{variantId}")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("/api/products/.*/variants/.*/$")
|
.WithUpstreamTemplatePattern("/api/products/.*/variants/.*/$")
|
||||||
.Build()
|
.Build()
|
||||||
@ -511,7 +523,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
UpstreamTemplate = "/api/products/{productId}/variants/{variantId}/",
|
UpstreamPathTemplate = "/api/products/{productId}/variants/{variantId}/",
|
||||||
DownstreamPathTemplate = "/products/{productId}",
|
DownstreamPathTemplate = "/products/{productId}",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = true
|
ReRouteIsCaseSensitive = true
|
||||||
@ -524,7 +536,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("/products/{productId}")
|
.WithDownstreamPathTemplate("/products/{productId}")
|
||||||
.WithUpstreamTemplate("/api/products/{productId}/variants/{variantId}/")
|
.WithUpstreamPathTemplate("/api/products/{productId}/variants/{variantId}/")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("/api/products/.*/variants/.*/$")
|
.WithUpstreamTemplatePattern("/api/products/.*/variants/.*/$")
|
||||||
.Build()
|
.Build()
|
||||||
@ -541,7 +553,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new FileReRoute
|
new FileReRoute
|
||||||
{
|
{
|
||||||
UpstreamTemplate = "/",
|
UpstreamPathTemplate = "/",
|
||||||
DownstreamPathTemplate = "/api/products/",
|
DownstreamPathTemplate = "/api/products/",
|
||||||
UpstreamHttpMethod = "Get",
|
UpstreamHttpMethod = "Get",
|
||||||
ReRouteIsCaseSensitive = true
|
ReRouteIsCaseSensitive = true
|
||||||
@ -554,7 +566,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("/api/products/")
|
.WithDownstreamPathTemplate("/api/products/")
|
||||||
.WithUpstreamTemplate("/")
|
.WithUpstreamPathTemplate("/")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("/$")
|
.WithUpstreamTemplatePattern("/$")
|
||||||
.Build()
|
.Build()
|
||||||
@ -591,7 +603,7 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
|
|
||||||
result.DownstreamPathTemplate.Value.ShouldBe(expected.DownstreamPathTemplate.Value);
|
result.DownstreamPathTemplate.Value.ShouldBe(expected.DownstreamPathTemplate.Value);
|
||||||
result.UpstreamHttpMethod.ShouldBe(expected.UpstreamHttpMethod);
|
result.UpstreamHttpMethod.ShouldBe(expected.UpstreamHttpMethod);
|
||||||
result.UpstreamTemplate.ShouldBe(expected.UpstreamTemplate);
|
result.UpstreamPathTemplate.Value.ShouldBe(expected.UpstreamPathTemplate.Value);
|
||||||
result.UpstreamTemplatePattern.ShouldBe(expected.UpstreamTemplatePattern);
|
result.UpstreamTemplatePattern.ShouldBe(expected.UpstreamTemplatePattern);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,10 @@ namespace Ocelot.UnitTests.Configuration
|
|||||||
|
|
||||||
public List<ReRoute> ReRoutes => new List<ReRoute>
|
public List<ReRoute> ReRoutes => new List<ReRoute>
|
||||||
{
|
{
|
||||||
new ReRouteBuilder().WithDownstreamPathTemplate(_downstreamTemplatePath).Build()
|
new ReRouteBuilder()
|
||||||
|
.WithDownstreamPathTemplate(_downstreamTemplatePath)
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,13 @@ namespace Ocelot.UnitTests.DownstreamRouteFinder
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void should_call_scoped_data_repository_correctly()
|
public void should_call_scoped_data_repository_correctly()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenTheDownStreamRouteFinderReturns(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(), new ReRouteBuilder().WithDownstreamPathTemplate("any old string").Build())))
|
this.Given(x => x.GivenTheDownStreamRouteFinderReturns(
|
||||||
|
new DownstreamRoute(
|
||||||
|
new List<UrlPathPlaceholderNameAndValue>(),
|
||||||
|
new ReRouteBuilder()
|
||||||
|
.WithDownstreamPathTemplate("any old string")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build())))
|
||||||
.When(x => x.WhenICallTheMiddleware())
|
.When(x => x.WhenICallTheMiddleware())
|
||||||
.Then(x => x.ThenTheScopedDataRepositoryIsCalledCorrectly())
|
.Then(x => x.ThenTheScopedDataRepositoryIsCalledCorrectly())
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
|
@ -45,7 +45,7 @@ namespace Ocelot.UnitTests.DownstreamRouteFinder
|
|||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("someDownstreamPath")
|
.WithDownstreamPathTemplate("someDownstreamPath")
|
||||||
.WithUpstreamTemplate("someUpstreamPath")
|
.WithUpstreamPathTemplate("someUpstreamPath")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("someUpstreamPath")
|
.WithUpstreamTemplatePattern("someUpstreamPath")
|
||||||
.Build()
|
.Build()
|
||||||
@ -58,6 +58,7 @@ namespace Ocelot.UnitTests.DownstreamRouteFinder
|
|||||||
x => x.ThenTheFollowingIsReturned(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
x => x.ThenTheFollowingIsReturned(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("someDownstreamPath")
|
.WithDownstreamPathTemplate("someDownstreamPath")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
.Build()
|
.Build()
|
||||||
)))
|
)))
|
||||||
.And(x => x.ThenTheUrlMatcherIsCalledCorrectly())
|
.And(x => x.ThenTheUrlMatcherIsCalledCorrectly())
|
||||||
@ -76,13 +77,13 @@ namespace Ocelot.UnitTests.DownstreamRouteFinder
|
|||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("someDownstreamPath")
|
.WithDownstreamPathTemplate("someDownstreamPath")
|
||||||
.WithUpstreamTemplate("someUpstreamPath")
|
.WithUpstreamPathTemplate("someUpstreamPath")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("")
|
.WithUpstreamTemplatePattern("")
|
||||||
.Build(),
|
.Build(),
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("someDownstreamPathForAPost")
|
.WithDownstreamPathTemplate("someDownstreamPathForAPost")
|
||||||
.WithUpstreamTemplate("someUpstreamPath")
|
.WithUpstreamPathTemplate("someUpstreamPath")
|
||||||
.WithUpstreamHttpMethod("Post")
|
.WithUpstreamHttpMethod("Post")
|
||||||
.WithUpstreamTemplatePattern("")
|
.WithUpstreamTemplatePattern("")
|
||||||
.Build()
|
.Build()
|
||||||
@ -95,6 +96,7 @@ namespace Ocelot.UnitTests.DownstreamRouteFinder
|
|||||||
x => x.ThenTheFollowingIsReturned(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
x => x.ThenTheFollowingIsReturned(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("someDownstreamPathForAPost")
|
.WithDownstreamPathTemplate("someDownstreamPathForAPost")
|
||||||
|
.WithUpstreamHttpMethod("Post")
|
||||||
.Build()
|
.Build()
|
||||||
)))
|
)))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -108,7 +110,7 @@ namespace Ocelot.UnitTests.DownstreamRouteFinder
|
|||||||
{
|
{
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("somPath")
|
.WithDownstreamPathTemplate("somPath")
|
||||||
.WithUpstreamTemplate("somePath")
|
.WithUpstreamPathTemplate("somePath")
|
||||||
.WithUpstreamHttpMethod("Get")
|
.WithUpstreamHttpMethod("Get")
|
||||||
.WithUpstreamTemplatePattern("somePath")
|
.WithUpstreamTemplatePattern("somePath")
|
||||||
.Build(),
|
.Build(),
|
||||||
@ -143,7 +145,7 @@ namespace Ocelot.UnitTests.DownstreamRouteFinder
|
|||||||
private void ThenTheUrlMatcherIsCalledCorrectly()
|
private void ThenTheUrlMatcherIsCalledCorrectly()
|
||||||
{
|
{
|
||||||
_mockMatcher
|
_mockMatcher
|
||||||
.Verify(x => x.Match(_upstreamUrlPath, _reRoutesConfig[0].UpstreamTemplate), Times.Once);
|
.Verify(x => x.Match(_upstreamUrlPath, _reRoutesConfig[0].UpstreamPathTemplate.Value), Times.Once);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GivenTheUrlMatcherReturns(Response<UrlMatch> match)
|
private void GivenTheUrlMatcherReturns(Response<UrlMatch> match)
|
||||||
|
@ -72,7 +72,13 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator
|
|||||||
{
|
{
|
||||||
var hostAndPort = new HostAndPort("127.0.0.1", 80);
|
var hostAndPort = new HostAndPort("127.0.0.1", 80);
|
||||||
|
|
||||||
this.Given(x => x.GivenTheDownStreamRouteIs(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(), new ReRouteBuilder().WithDownstreamPathTemplate("any old string").Build())))
|
this.Given(x => x.GivenTheDownStreamRouteIs(
|
||||||
|
new DownstreamRoute(
|
||||||
|
new List<UrlPathPlaceholderNameAndValue>(),
|
||||||
|
new ReRouteBuilder()
|
||||||
|
.WithDownstreamPathTemplate("any old string")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build())))
|
||||||
.And(x => x.GivenTheHostAndPortIs(hostAndPort))
|
.And(x => x.GivenTheHostAndPortIs(hostAndPort))
|
||||||
.And(x => x.TheUrlReplacerReturns("/api/products/1"))
|
.And(x => x.TheUrlReplacerReturns("/api/products/1"))
|
||||||
.And(x => x.TheUrlBuilderReturns("http://127.0.0.1:80/api/products/1"))
|
.And(x => x.TheUrlBuilderReturns("http://127.0.0.1:80/api/products/1"))
|
||||||
@ -101,7 +107,7 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator
|
|||||||
{
|
{
|
||||||
_downstreamPath = new OkResponse<DownstreamPath>(new DownstreamPath(downstreamUrl));
|
_downstreamPath = new OkResponse<DownstreamPath>(new DownstreamPath(downstreamUrl));
|
||||||
_downstreamUrlTemplateVariableReplacer
|
_downstreamUrlTemplateVariableReplacer
|
||||||
.Setup(x => x.Replace(It.IsAny<DownstreamPathTemplate>(), It.IsAny<List<UrlPathPlaceholderNameAndValue>>()))
|
.Setup(x => x.Replace(It.IsAny<PathTemplate>(), It.IsAny<List<UrlPathPlaceholderNameAndValue>>()))
|
||||||
.Returns(_downstreamPath);
|
.Returns(_downstreamPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,12 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator.UrlTemplateReplacer
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void can_replace_no_template_variables()
|
public void can_replace_no_template_variables()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(), new ReRouteBuilder().Build())))
|
this.Given(x => x.GivenThereIsAUrlMatch(
|
||||||
|
new DownstreamRoute(
|
||||||
|
new List<UrlPathPlaceholderNameAndValue>(),
|
||||||
|
new ReRouteBuilder()
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build())))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned(""))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned(""))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -34,7 +39,13 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator.UrlTemplateReplacer
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void can_replace_no_template_variables_with_slash()
|
public void can_replace_no_template_variables_with_slash()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(), new ReRouteBuilder().WithDownstreamPathTemplate("/").Build())))
|
this.Given(x => x.GivenThereIsAUrlMatch(
|
||||||
|
new DownstreamRoute(
|
||||||
|
new List<UrlPathPlaceholderNameAndValue>(),
|
||||||
|
new ReRouteBuilder()
|
||||||
|
.WithDownstreamPathTemplate("/")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build())))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("/"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("/"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -43,7 +54,11 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator.UrlTemplateReplacer
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void can_replace_url_no_slash()
|
public void can_replace_url_no_slash()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(), new ReRouteBuilder().WithDownstreamPathTemplate("api").Build())))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
||||||
|
new ReRouteBuilder()
|
||||||
|
.WithDownstreamPathTemplate("api")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build())))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("api"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("api"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -52,7 +67,11 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator.UrlTemplateReplacer
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void can_replace_url_one_slash()
|
public void can_replace_url_one_slash()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(), new ReRouteBuilder().WithDownstreamPathTemplate("api/").Build())))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
||||||
|
new ReRouteBuilder()
|
||||||
|
.WithDownstreamPathTemplate("api/")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build())))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("api/"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("api/"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -61,7 +80,11 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator.UrlTemplateReplacer
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void can_replace_url_multiple_slash()
|
public void can_replace_url_multiple_slash()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(), new ReRouteBuilder().WithDownstreamPathTemplate("api/product/products/").Build())))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
||||||
|
new ReRouteBuilder()
|
||||||
|
.WithDownstreamPathTemplate("api/product/products/")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build())))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("api/product/products/"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("api/product/products/"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -75,7 +98,11 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator.UrlTemplateReplacer
|
|||||||
new UrlPathPlaceholderNameAndValue("{productId}", "1")
|
new UrlPathPlaceholderNameAndValue("{productId}", "1")
|
||||||
};
|
};
|
||||||
|
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(templateVariables, new ReRouteBuilder().WithDownstreamPathTemplate("productservice/products/{productId}/").Build())))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(templateVariables,
|
||||||
|
new ReRouteBuilder()
|
||||||
|
.WithDownstreamPathTemplate("productservice/products/{productId}/")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build())))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/products/1/"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/products/1/"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -89,7 +116,11 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator.UrlTemplateReplacer
|
|||||||
new UrlPathPlaceholderNameAndValue("{productId}", "1")
|
new UrlPathPlaceholderNameAndValue("{productId}", "1")
|
||||||
};
|
};
|
||||||
|
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(templateVariables, new ReRouteBuilder().WithDownstreamPathTemplate("productservice/products/{productId}/variants").Build())))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(templateVariables,
|
||||||
|
new ReRouteBuilder()
|
||||||
|
.WithDownstreamPathTemplate("productservice/products/{productId}/variants")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build())))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/products/1/variants"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/products/1/variants"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -104,7 +135,11 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator.UrlTemplateReplacer
|
|||||||
new UrlPathPlaceholderNameAndValue("{variantId}", "12")
|
new UrlPathPlaceholderNameAndValue("{variantId}", "12")
|
||||||
};
|
};
|
||||||
|
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(templateVariables, new ReRouteBuilder().WithDownstreamPathTemplate("productservice/products/{productId}/variants/{variantId}").Build())))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(templateVariables,
|
||||||
|
new ReRouteBuilder()
|
||||||
|
.WithDownstreamPathTemplate("productservice/products/{productId}/variants/{variantId}")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build())))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/products/1/variants/12"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/products/1/variants/12"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -120,7 +155,11 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator.UrlTemplateReplacer
|
|||||||
new UrlPathPlaceholderNameAndValue("{categoryId}", "34")
|
new UrlPathPlaceholderNameAndValue("{categoryId}", "34")
|
||||||
};
|
};
|
||||||
|
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(templateVariables, new ReRouteBuilder().WithDownstreamPathTemplate("productservice/category/{categoryId}/products/{productId}/variants/{variantId}").Build())))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(templateVariables,
|
||||||
|
new ReRouteBuilder()
|
||||||
|
.WithDownstreamPathTemplate("productservice/category/{categoryId}/products/{productId}/variants/{variantId}")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build())))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/category/34/products/1/variants/12"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/category/34/products/1/variants/12"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
|
@ -72,6 +72,7 @@ namespace Ocelot.UnitTests.Headers
|
|||||||
{
|
{
|
||||||
new ClaimToThing("UserId", "Subject", "", 0)
|
new ClaimToThing("UserId", "Subject", "", 0)
|
||||||
})
|
})
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
.Build());
|
.Build());
|
||||||
|
|
||||||
this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute))
|
this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute))
|
||||||
|
@ -24,18 +24,13 @@ namespace Ocelot.UnitTests.LoadBalancer
|
|||||||
_factory = new LoadBalancerFactory(_serviceProviderFactory.Object);
|
_factory = new LoadBalancerFactory(_serviceProviderFactory.Object);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GivenTheServiceProviderFactoryReturns()
|
|
||||||
{
|
|
||||||
_serviceProviderFactory
|
|
||||||
.Setup(x => x.Get(It.IsAny<ServiceProviderConfiguraion>()))
|
|
||||||
.Returns(_serviceProvider.Object);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void should_return_no_load_balancer()
|
public void should_return_no_load_balancer()
|
||||||
{
|
{
|
||||||
var reRoute = new ReRouteBuilder()
|
var reRoute = new ReRouteBuilder()
|
||||||
.Build();
|
.WithServiceProviderConfiguraion(new ServiceProviderConfiguraionBuilder().Build())
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build();
|
||||||
|
|
||||||
this.Given(x => x.GivenAReRoute(reRoute))
|
this.Given(x => x.GivenAReRoute(reRoute))
|
||||||
.And(x => x.GivenTheServiceProviderFactoryReturns())
|
.And(x => x.GivenTheServiceProviderFactoryReturns())
|
||||||
@ -49,6 +44,8 @@ namespace Ocelot.UnitTests.LoadBalancer
|
|||||||
{
|
{
|
||||||
var reRoute = new ReRouteBuilder()
|
var reRoute = new ReRouteBuilder()
|
||||||
.WithLoadBalancer("RoundRobin")
|
.WithLoadBalancer("RoundRobin")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.WithServiceProviderConfiguraion(new ServiceProviderConfiguraionBuilder().Build())
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
this.Given(x => x.GivenAReRoute(reRoute))
|
this.Given(x => x.GivenAReRoute(reRoute))
|
||||||
@ -63,6 +60,8 @@ namespace Ocelot.UnitTests.LoadBalancer
|
|||||||
{
|
{
|
||||||
var reRoute = new ReRouteBuilder()
|
var reRoute = new ReRouteBuilder()
|
||||||
.WithLoadBalancer("LeastConnection")
|
.WithLoadBalancer("LeastConnection")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.WithServiceProviderConfiguraion(new ServiceProviderConfiguraionBuilder().Build())
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
this.Given(x => x.GivenAReRoute(reRoute))
|
this.Given(x => x.GivenAReRoute(reRoute))
|
||||||
@ -77,6 +76,8 @@ namespace Ocelot.UnitTests.LoadBalancer
|
|||||||
{
|
{
|
||||||
var reRoute = new ReRouteBuilder()
|
var reRoute = new ReRouteBuilder()
|
||||||
.WithLoadBalancer("RoundRobin")
|
.WithLoadBalancer("RoundRobin")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.WithServiceProviderConfiguraion(new ServiceProviderConfiguraionBuilder().Build())
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
this.Given(x => x.GivenAReRoute(reRoute))
|
this.Given(x => x.GivenAReRoute(reRoute))
|
||||||
@ -86,6 +87,13 @@ namespace Ocelot.UnitTests.LoadBalancer
|
|||||||
.BDDfy();
|
.BDDfy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void GivenTheServiceProviderFactoryReturns()
|
||||||
|
{
|
||||||
|
_serviceProviderFactory
|
||||||
|
.Setup(x => x.Get(It.IsAny<ServiceProviderConfiguraion>()))
|
||||||
|
.Returns(_serviceProvider.Object);
|
||||||
|
}
|
||||||
|
|
||||||
private void ThenTheServiceProviderIsCalledCorrectly()
|
private void ThenTheServiceProviderIsCalledCorrectly()
|
||||||
{
|
{
|
||||||
_serviceProviderFactory
|
_serviceProviderFactory
|
||||||
|
@ -68,6 +68,7 @@ namespace Ocelot.UnitTests.LoadBalancer
|
|||||||
{
|
{
|
||||||
var downstreamRoute = new DownstreamRoute(new List<Ocelot.DownstreamRouteFinder.UrlMatcher.UrlPathPlaceholderNameAndValue>(),
|
var downstreamRoute = new DownstreamRoute(new List<Ocelot.DownstreamRouteFinder.UrlMatcher.UrlPathPlaceholderNameAndValue>(),
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
.Build());
|
.Build());
|
||||||
|
|
||||||
this.Given(x => x.GivenTheDownStreamUrlIs("any old string"))
|
this.Given(x => x.GivenTheDownStreamUrlIs("any old string"))
|
||||||
@ -84,6 +85,7 @@ namespace Ocelot.UnitTests.LoadBalancer
|
|||||||
{
|
{
|
||||||
var downstreamRoute = new DownstreamRoute(new List<Ocelot.DownstreamRouteFinder.UrlMatcher.UrlPathPlaceholderNameAndValue>(),
|
var downstreamRoute = new DownstreamRoute(new List<Ocelot.DownstreamRouteFinder.UrlMatcher.UrlPathPlaceholderNameAndValue>(),
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
.Build());
|
.Build());
|
||||||
|
|
||||||
this.Given(x => x.GivenTheDownStreamUrlIs("any old string"))
|
this.Given(x => x.GivenTheDownStreamUrlIs("any old string"))
|
||||||
@ -99,6 +101,7 @@ namespace Ocelot.UnitTests.LoadBalancer
|
|||||||
{
|
{
|
||||||
var downstreamRoute = new DownstreamRoute(new List<Ocelot.DownstreamRouteFinder.UrlMatcher.UrlPathPlaceholderNameAndValue>(),
|
var downstreamRoute = new DownstreamRoute(new List<Ocelot.DownstreamRouteFinder.UrlMatcher.UrlPathPlaceholderNameAndValue>(),
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
.Build());
|
.Build());
|
||||||
|
|
||||||
this.Given(x => x.GivenTheDownStreamUrlIs("any old string"))
|
this.Given(x => x.GivenTheDownStreamUrlIs("any old string"))
|
||||||
|
@ -70,6 +70,7 @@ namespace Ocelot.UnitTests.QueryStrings
|
|||||||
{
|
{
|
||||||
new ClaimToThing("UserId", "Subject", "", 0)
|
new ClaimToThing("UserId", "Subject", "", 0)
|
||||||
})
|
})
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
.Build());
|
.Build());
|
||||||
|
|
||||||
this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute))
|
this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute))
|
||||||
|
@ -68,7 +68,9 @@ namespace Ocelot.UnitTests.Request
|
|||||||
|
|
||||||
var downstreamRoute = new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
var downstreamRoute = new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithRequestIdKey("LSRequestId").Build());
|
.WithRequestIdKey("LSRequestId")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build());
|
||||||
|
|
||||||
|
|
||||||
this.Given(x => x.GivenTheDownStreamUrlIs("any old string"))
|
this.Given(x => x.GivenTheDownStreamUrlIs("any old string"))
|
||||||
|
@ -72,7 +72,9 @@ namespace Ocelot.UnitTests.RequestId
|
|||||||
var downstreamRoute = new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
var downstreamRoute = new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("any old string")
|
.WithDownstreamPathTemplate("any old string")
|
||||||
.WithRequestIdKey("LSRequestId").Build());
|
.WithRequestIdKey("LSRequestId")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build());
|
||||||
|
|
||||||
var requestId = Guid.NewGuid().ToString();
|
var requestId = Guid.NewGuid().ToString();
|
||||||
|
|
||||||
@ -89,7 +91,9 @@ namespace Ocelot.UnitTests.RequestId
|
|||||||
var downstreamRoute = new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
var downstreamRoute = new DownstreamRoute(new List<UrlPathPlaceholderNameAndValue>(),
|
||||||
new ReRouteBuilder()
|
new ReRouteBuilder()
|
||||||
.WithDownstreamPathTemplate("any old string")
|
.WithDownstreamPathTemplate("any old string")
|
||||||
.WithRequestIdKey("LSRequestId").Build());
|
.WithRequestIdKey("LSRequestId")
|
||||||
|
.WithUpstreamHttpMethod("Get")
|
||||||
|
.Build());
|
||||||
|
|
||||||
this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute))
|
this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute))
|
||||||
.When(x => x.WhenICallTheMiddleware())
|
.When(x => x.WhenICallTheMiddleware())
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
|
||||||
using System.Net.Http;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Ocelot.Errors;
|
using Ocelot.Errors;
|
||||||
using Ocelot.Middleware;
|
using Ocelot.Middleware;
|
||||||
using Ocelot.Responder;
|
using Ocelot.Responder;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using Ocelot.Configuration;
|
using Ocelot.Configuration;
|
||||||
|
using Ocelot.Configuration.Builder;
|
||||||
using Ocelot.ServiceDiscovery;
|
using Ocelot.ServiceDiscovery;
|
||||||
using Shouldly;
|
using Shouldly;
|
||||||
using TestStack.BDDfy;
|
using TestStack.BDDfy;
|
||||||
@ -20,7 +21,11 @@ namespace Ocelot.UnitTests.ServiceDiscovery
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void should_return_no_service_provider()
|
public void should_return_no_service_provider()
|
||||||
{
|
{
|
||||||
var serviceConfig = new ServiceProviderConfiguraion("product", "127.0.0.1", 80, false, "Does not matter", string.Empty, 0);
|
var serviceConfig = new ServiceProviderConfiguraionBuilder()
|
||||||
|
.WithDownstreamHost("127.0.0.1")
|
||||||
|
.WithDownstreamPort(80)
|
||||||
|
.WithUseServiceDiscovery(false)
|
||||||
|
.Build();
|
||||||
|
|
||||||
this.Given(x => x.GivenTheReRoute(serviceConfig))
|
this.Given(x => x.GivenTheReRoute(serviceConfig))
|
||||||
.When(x => x.WhenIGetTheServiceProvider())
|
.When(x => x.WhenIGetTheServiceProvider())
|
||||||
@ -31,7 +36,11 @@ namespace Ocelot.UnitTests.ServiceDiscovery
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void should_return_consul_service_provider()
|
public void should_return_consul_service_provider()
|
||||||
{
|
{
|
||||||
var serviceConfig = new ServiceProviderConfiguraion("product", string.Empty, 0, true, "Consul", string.Empty, 0);
|
var serviceConfig = new ServiceProviderConfiguraionBuilder()
|
||||||
|
.WithServiceName("product")
|
||||||
|
.WithUseServiceDiscovery(true)
|
||||||
|
.WithServiceDiscoveryProvider("Consul")
|
||||||
|
.Build();
|
||||||
|
|
||||||
this.Given(x => x.GivenTheReRoute(serviceConfig))
|
this.Given(x => x.GivenTheReRoute(serviceConfig))
|
||||||
.When(x => x.WhenIGetTheServiceProvider())
|
.When(x => x.WhenIGetTheServiceProvider())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user