mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-10-31 10:19:26 +08:00 
			
		
		
		
	I realised we can get rid of the cookie container as cookies are just sent as a header called cookie...
This commit is contained in:
		| @@ -14,7 +14,6 @@ namespace Ocelot.Request.Builder | ||||
|             string downstreamUrl,  | ||||
|             Stream content,  | ||||
|             IHeaderDictionary headers, | ||||
|             IRequestCookieCollection cookies,  | ||||
|             QueryString queryString,  | ||||
|             string contentType,  | ||||
|             RequestId.RequestId requestId, | ||||
| @@ -29,7 +28,6 @@ namespace Ocelot.Request.Builder | ||||
|                 .WithContentType(contentType) | ||||
|                 .WithHeaders(headers) | ||||
|                 .WithRequestId(requestId) | ||||
|                 .WithCookies(cookies) | ||||
|                 .WithIsQos(isQos) | ||||
|                 .WithQos(qosProvider) | ||||
|                 .Build(); | ||||
|   | ||||
| @@ -12,7 +12,6 @@ namespace Ocelot.Request.Builder | ||||
|             string downstreamUrl, | ||||
|             Stream content, | ||||
|             IHeaderDictionary headers, | ||||
|             IRequestCookieCollection cookies, | ||||
|             QueryString queryString, | ||||
|             string contentType, | ||||
|             RequestId.RequestId requestId, | ||||
|   | ||||
| @@ -21,7 +21,6 @@ namespace Ocelot.Request.Builder | ||||
|         private string _contentType; | ||||
|         private IHeaderDictionary _headers; | ||||
|         private RequestId.RequestId _requestId; | ||||
|         private IRequestCookieCollection _cookies; | ||||
|         private readonly string[] _unsupportedHeaders = {"host"}; | ||||
|         private bool _isQos; | ||||
|         private IQoSProvider _qoSProvider; | ||||
| @@ -68,12 +67,6 @@ namespace Ocelot.Request.Builder | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         public RequestBuilder WithCookies(IRequestCookieCollection cookies) | ||||
|         { | ||||
|             _cookies = cookies; | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         public RequestBuilder WithIsQos(bool isqos) | ||||
|         { | ||||
|             _isQos = isqos; | ||||
| @@ -103,9 +96,7 @@ namespace Ocelot.Request.Builder | ||||
|                 AddRequestIdHeader(_requestId, httpRequestMessage); | ||||
|             } | ||||
|  | ||||
|             var cookieContainer = CreateCookieContainer(uri); | ||||
|  | ||||
|             return new Request(httpRequestMessage, cookieContainer,_isQos, _qoSProvider); | ||||
|             return new Request(httpRequestMessage,_isQos, _qoSProvider); | ||||
|         } | ||||
|  | ||||
|         private Uri CreateUri() | ||||
| @@ -153,21 +144,6 @@ namespace Ocelot.Request.Builder | ||||
|             return !_unsupportedHeaders.Contains(header.Key.ToLower()); | ||||
|         } | ||||
|  | ||||
|         private CookieContainer CreateCookieContainer(Uri uri) | ||||
|         { | ||||
|             var cookieContainer = new CookieContainer(); | ||||
|  | ||||
|             if (_cookies != null) | ||||
|             { | ||||
|                 foreach (var cookie in _cookies) | ||||
|                 { | ||||
|                     cookieContainer.Add(uri, new Cookie(cookie.Key, cookie.Value)); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return cookieContainer; | ||||
|         } | ||||
|  | ||||
|         private void AddRequestIdHeader(RequestId.RequestId requestId, HttpRequestMessage httpRequestMessage) | ||||
|         { | ||||
|             httpRequestMessage.Headers.Add(requestId.RequestIdKey, requestId.RequestIdValue); | ||||
|   | ||||
| @@ -48,7 +48,6 @@ namespace Ocelot.Request.Middleware | ||||
|                     DownstreamUrl, | ||||
|                     context.Request.Body, | ||||
|                     context.Request.Headers, | ||||
|                     context.Request.Cookies, | ||||
|                     context.Request.QueryString, | ||||
|                     context.Request.ContentType, | ||||
|                     new RequestId.RequestId(DownstreamRoute?.ReRoute?.RequestIdKey, context.TraceIdentifier), | ||||
|   | ||||
| @@ -1,7 +1,4 @@ | ||||
| using Ocelot.Configuration; | ||||
| using Ocelot.Values; | ||||
| using System.Net; | ||||
| using System.Net.Http; | ||||
| using System.Net.Http; | ||||
| using Ocelot.Requester.QoS; | ||||
|  | ||||
| namespace Ocelot.Request | ||||
| @@ -10,18 +7,15 @@ namespace Ocelot.Request | ||||
|     { | ||||
|         public Request( | ||||
|             HttpRequestMessage httpRequestMessage,  | ||||
|             CookieContainer cookieContainer, | ||||
|             bool isQos, | ||||
|             IQoSProvider qosProvider) | ||||
|         { | ||||
|             HttpRequestMessage = httpRequestMessage; | ||||
|             CookieContainer = cookieContainer; | ||||
|             IsQos = isQos; | ||||
|             QosProvider = qosProvider; | ||||
|         } | ||||
|  | ||||
|         public HttpRequestMessage HttpRequestMessage { get; private set; } | ||||
|         public CookieContainer CookieContainer { get; private set; } | ||||
|         public bool IsQos { get; private set; } | ||||
|         public IQoSProvider QosProvider { get; private set; } | ||||
|     } | ||||
|   | ||||
| @@ -11,17 +11,17 @@ namespace Ocelot.Requester | ||||
|     { | ||||
|         private readonly Dictionary<int, Func<DelegatingHandler>> _handlers = new Dictionary<int, Func<DelegatingHandler>>(); | ||||
|  | ||||
|         public HttpClientBuilder WithQoS(IQoSProvider qoSProvider, IOcelotLogger logger, HttpMessageHandler innerHandler) | ||||
|         public HttpClientBuilder WithQoS(IQoSProvider qoSProvider, IOcelotLogger logger) | ||||
|         { | ||||
|             _handlers.Add(5000, () => new PollyCircuitBreakingDelegatingHandler(qoSProvider, logger, innerHandler)); | ||||
|             _handlers.Add(5000, () => new PollyCircuitBreakingDelegatingHandler(qoSProvider, logger)); | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         internal HttpClient Build(HttpMessageHandler innerHandler) | ||||
|         internal HttpClient Build() | ||||
|         { | ||||
|             return _handlers.Any() ?  | ||||
|                 new HttpClient(CreateHttpMessageHandler()) :  | ||||
|                 new HttpClient(innerHandler); | ||||
|                 new HttpClient(); | ||||
|         } | ||||
|  | ||||
|         private HttpMessageHandler CreateHttpMessageHandler() | ||||
|   | ||||
| @@ -19,36 +19,33 @@ namespace Ocelot.Requester | ||||
|  | ||||
|         public async Task<Response<HttpResponseMessage>> GetResponse(Request.Request request) | ||||
|         { | ||||
|             var builder = new HttpClientBuilder();     | ||||
|             var builder = new HttpClientBuilder(); | ||||
|  | ||||
|             using (var handler = new HttpClientHandler { CookieContainer = request.CookieContainer }) | ||||
|             if (request.IsQos) | ||||
|             { | ||||
|                 if (request.IsQos) | ||||
|                 { | ||||
|                     builder.WithQoS(request.QosProvider, _logger, handler); | ||||
|                 }            | ||||
|                 builder.WithQoS(request.QosProvider, _logger); | ||||
|             } | ||||
|  | ||||
|                 using (var httpClient = builder.Build(handler)) | ||||
|             using (var httpClient = builder.Build()) | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     try | ||||
|                     { | ||||
|                         var response = await httpClient.SendAsync(request.HttpRequestMessage); | ||||
|                         return new OkResponse<HttpResponseMessage>(response); | ||||
|                     } | ||||
|                     catch (TimeoutRejectedException exception) | ||||
|                     { | ||||
|                         return | ||||
|                             new ErrorResponse<HttpResponseMessage>(new RequestTimedOutError(exception)); | ||||
|                     } | ||||
|                     catch (BrokenCircuitException exception) | ||||
|                     { | ||||
|                         return | ||||
|                             new ErrorResponse<HttpResponseMessage>(new RequestTimedOutError(exception)); | ||||
|                     } | ||||
|                     catch (Exception exception) | ||||
|                     { | ||||
|                         return new ErrorResponse<HttpResponseMessage>(new UnableToCompleteRequestError(exception)); | ||||
|                     } | ||||
|                     var response = await httpClient.SendAsync(request.HttpRequestMessage); | ||||
|                     return new OkResponse<HttpResponseMessage>(response); | ||||
|                 } | ||||
|                 catch (TimeoutRejectedException exception) | ||||
|                 { | ||||
|                     return | ||||
|                         new ErrorResponse<HttpResponseMessage>(new RequestTimedOutError(exception)); | ||||
|                 } | ||||
|                 catch (BrokenCircuitException exception) | ||||
|                 { | ||||
|                     return | ||||
|                         new ErrorResponse<HttpResponseMessage>(new RequestTimedOutError(exception)); | ||||
|                 } | ||||
|                 catch (Exception exception) | ||||
|                 { | ||||
|                     return new ErrorResponse<HttpResponseMessage>(new UnableToCompleteRequestError(exception)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -16,9 +16,7 @@ namespace Ocelot.Requester | ||||
|  | ||||
|         public PollyCircuitBreakingDelegatingHandler( | ||||
|             IQoSProvider qoSProvider, | ||||
|             IOcelotLogger logger,  | ||||
|             HttpMessageHandler innerHandler) | ||||
|             : base(innerHandler) | ||||
|             IOcelotLogger logger) | ||||
|         { | ||||
|             _qoSProvider = qoSProvider; | ||||
|             _logger = logger; | ||||
|   | ||||
| @@ -1,303 +1,311 @@ | ||||
| { | ||||
|   "ReRoutes": [ | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "localhost", | ||||
|       "DownstreamPort": 52876, | ||||
|       "UpstreamPathTemplate": "/identityserverexample", | ||||
|       "UpstreamHttpMethod": "Get", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       }, | ||||
|       "AuthenticationOptions": { | ||||
|         "Provider": "IdentityServer", | ||||
|         "ProviderRootUrl": "http://localhost:52888", | ||||
|         "ScopeName": "api", | ||||
|         "AdditionalScopes": [ | ||||
|           "openid", | ||||
|           "offline_access" | ||||
|         ], | ||||
|         "ScopeSecret": "secret" | ||||
|       }, | ||||
|       "AddHeadersToRequest": { | ||||
|         "CustomerId": "Claims[CustomerId] > value", | ||||
|         "LocationId": "Claims[LocationId] > value", | ||||
|         "UserType": "Claims[sub] > value[0] > |", | ||||
|         "UserId": "Claims[sub] > value[1] > |" | ||||
|       }, | ||||
|       "AddClaimsToRequest": { | ||||
|         "CustomerId": "Claims[CustomerId] > value", | ||||
|         "LocationId": "Claims[LocationId] > value", | ||||
|         "UserType": "Claims[sub] > value[0] > |", | ||||
|         "UserId": "Claims[sub] > value[1] > |" | ||||
|       }, | ||||
|       "AddQueriesToRequest": { | ||||
|         "CustomerId": "Claims[CustomerId] > value", | ||||
|         "LocationId": "Claims[LocationId] > value", | ||||
|         "UserType": "Claims[sub] > value[0] > |", | ||||
|         "UserId": "Claims[sub] > value[1] > |" | ||||
|       }, | ||||
|       "RouteClaimsRequirement": { | ||||
|         "UserType": "registered" | ||||
|       }, | ||||
|       "RequestIdKey": "OcRequestId" | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/posts", | ||||
|       "DownstreamScheme": "https", | ||||
|       "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|       "DownstreamPort": 443, | ||||
|       "UpstreamPathTemplate": "/posts", | ||||
|       "UpstreamHttpMethod": "Get", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/posts/{postId}", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/posts/{postId}", | ||||
|       "UpstreamHttpMethod": "Get", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/posts/{postId}/comments", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/posts/{postId}/comments", | ||||
|       "UpstreamHttpMethod": "Get", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/comments", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/comments", | ||||
|       "UpstreamHttpMethod": "Get", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/posts", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/posts", | ||||
|       "UpstreamHttpMethod": "Post", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/posts/{postId}", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/posts/{postId}", | ||||
|       "UpstreamHttpMethod": "Put", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/posts/{postId}", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/posts/{postId}", | ||||
|       "UpstreamHttpMethod": "Patch", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/posts/{postId}", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/posts/{postId}", | ||||
|       "UpstreamHttpMethod": "Delete", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/api/products", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/products", | ||||
|       "UpstreamHttpMethod": "Get", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       }, | ||||
|       "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/api/products/{productId}", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/products/{productId}", | ||||
|       "UpstreamHttpMethod": "Get", | ||||
|       "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/api/products", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "products20161126090340.azurewebsites.net", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/products", | ||||
|       "UpstreamHttpMethod": "Post", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/api/products/{productId}", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "products20161126090340.azurewebsites.net", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/products/{productId}", | ||||
|       "UpstreamHttpMethod": "Put", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       }, | ||||
|       "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/api/products/{productId}", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "products20161126090340.azurewebsites.net", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/products/{productId}", | ||||
|       "UpstreamHttpMethod": "Delete", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       }, | ||||
|       "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/api/customers", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "customers20161126090811.azurewebsites.net", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/customers", | ||||
|       "UpstreamHttpMethod": "Get", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       }, | ||||
|       "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/api/customers/{customerId}", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "customers20161126090811.azurewebsites.net", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/customers/{customerId}", | ||||
|       "UpstreamHttpMethod": "Get", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       }, | ||||
|       "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/api/customers", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "customers20161126090811.azurewebsites.net", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/customers", | ||||
|       "UpstreamHttpMethod": "Post", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       }, | ||||
|       "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/api/customers/{customerId}", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "customers20161126090811.azurewebsites.net", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/customers/{customerId}", | ||||
|       "UpstreamHttpMethod": "Put", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       }, | ||||
|       "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/api/customers/{customerId}", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "customers20161126090811.azurewebsites.net", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/customers/{customerId}", | ||||
|       "UpstreamHttpMethod": "Delete", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       }, | ||||
|       "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|     }, | ||||
|     { | ||||
|       "DownstreamPathTemplate": "/posts", | ||||
|       "DownstreamScheme": "http", | ||||
|       "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|       "DownstreamPort": 80, | ||||
|       "UpstreamPathTemplate": "/posts/", | ||||
|       "UpstreamHttpMethod": "Get", | ||||
|       "QoSOptions": { | ||||
|         "ExceptionsAllowedBeforeBreaking": 3, | ||||
|         "DurationOfBreak": 10, | ||||
|         "TimeoutValue": 5000 | ||||
|       }, | ||||
|       "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|     } | ||||
|   ], | ||||
|     "ReRoutes": [ | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "localhost", | ||||
|             "DownstreamPort": 52876, | ||||
|             "UpstreamPathTemplate": "/identityserverexample", | ||||
|             "UpstreamHttpMethod": "Get", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             }, | ||||
|             "AuthenticationOptions": { | ||||
|                 "Provider": "IdentityServer", | ||||
|                 "ProviderRootUrl": "http://localhost:52888", | ||||
|                 "ScopeName": "api", | ||||
|                 "AdditionalScopes": [ | ||||
|                     "openid", | ||||
|                     "offline_access" | ||||
|                 ], | ||||
|                 "ScopeSecret": "secret" | ||||
|             }, | ||||
|             "AddHeadersToRequest": { | ||||
|                 "CustomerId": "Claims[CustomerId] > value", | ||||
|                 "LocationId": "Claims[LocationId] > value", | ||||
|                 "UserType": "Claims[sub] > value[0] > |", | ||||
|                 "UserId": "Claims[sub] > value[1] > |" | ||||
|             }, | ||||
|             "AddClaimsToRequest": { | ||||
|                 "CustomerId": "Claims[CustomerId] > value", | ||||
|                 "LocationId": "Claims[LocationId] > value", | ||||
|                 "UserType": "Claims[sub] > value[0] > |", | ||||
|                 "UserId": "Claims[sub] > value[1] > |" | ||||
|             }, | ||||
|             "AddQueriesToRequest": { | ||||
|                 "CustomerId": "Claims[CustomerId] > value", | ||||
|                 "LocationId": "Claims[LocationId] > value", | ||||
|                 "UserType": "Claims[sub] > value[0] > |", | ||||
|                 "UserId": "Claims[sub] > value[1] > |" | ||||
|             }, | ||||
|             "RouteClaimsRequirement": { | ||||
|                 "UserType": "registered" | ||||
|             }, | ||||
|             "RequestIdKey": "OcRequestId" | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/posts", | ||||
|             "DownstreamScheme": "https", | ||||
|             "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|             "DownstreamPort": 443, | ||||
|             "UpstreamPathTemplate": "/posts", | ||||
|             "UpstreamHttpMethod": "Get", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/posts/{postId}", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/posts/{postId}", | ||||
|             "UpstreamHttpMethod": "Get", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/posts/{postId}/comments", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/posts/{postId}/comments", | ||||
|             "UpstreamHttpMethod": "Get", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/comments", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/comments", | ||||
|             "UpstreamHttpMethod": "Get", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/posts", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/posts", | ||||
|             "UpstreamHttpMethod": "Post", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/posts/{postId}", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/posts/{postId}", | ||||
|             "UpstreamHttpMethod": "Put", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/posts/{postId}", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/posts/{postId}", | ||||
|             "UpstreamHttpMethod": "Patch", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/posts/{postId}", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/posts/{postId}", | ||||
|             "UpstreamHttpMethod": "Delete", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/api/products", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/products", | ||||
|             "UpstreamHttpMethod": "Get", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             }, | ||||
|             "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/api/products/{productId}", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/products/{productId}", | ||||
|             "UpstreamHttpMethod": "Get", | ||||
|             "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/api/products", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "products20161126090340.azurewebsites.net", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/products", | ||||
|             "UpstreamHttpMethod": "Post", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/api/products/{productId}", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "products20161126090340.azurewebsites.net", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/products/{productId}", | ||||
|             "UpstreamHttpMethod": "Put", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             }, | ||||
|             "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/api/products/{productId}", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "products20161126090340.azurewebsites.net", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/products/{productId}", | ||||
|             "UpstreamHttpMethod": "Delete", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             }, | ||||
|             "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/api/customers", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "customers20161126090811.azurewebsites.net", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/customers", | ||||
|             "UpstreamHttpMethod": "Get", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             }, | ||||
|             "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/api/customers/{customerId}", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "customers20161126090811.azurewebsites.net", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/customers/{customerId}", | ||||
|             "UpstreamHttpMethod": "Get", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             }, | ||||
|             "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/api/customers", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "customers20161126090811.azurewebsites.net", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/customers", | ||||
|             "UpstreamHttpMethod": "Post", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             }, | ||||
|             "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/api/customers/{customerId}", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "customers20161126090811.azurewebsites.net", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/customers/{customerId}", | ||||
|             "UpstreamHttpMethod": "Put", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             }, | ||||
|             "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/api/customers/{customerId}", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "customers20161126090811.azurewebsites.net", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/customers/{customerId}", | ||||
|             "UpstreamHttpMethod": "Delete", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             }, | ||||
|             "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/posts", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "jsonplaceholder.typicode.com", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/posts/", | ||||
|             "UpstreamHttpMethod": "Get", | ||||
|             "QoSOptions": { | ||||
|                 "ExceptionsAllowedBeforeBreaking": 3, | ||||
|                 "DurationOfBreak": 10, | ||||
|                 "TimeoutValue": 5000 | ||||
|             }, | ||||
|             "FileCacheOptions": { "TtlSeconds": 15 } | ||||
|         }, | ||||
|         { | ||||
|             "DownstreamPathTemplate": "/", | ||||
|             "DownstreamScheme": "http", | ||||
|             "DownstreamHost": "www.bbc.co.uk", | ||||
|             "DownstreamPort": 80, | ||||
|             "UpstreamPathTemplate": "/bbc/", | ||||
|             "UpstreamHttpMethod": "Get" | ||||
|         } | ||||
|     ], | ||||
|  | ||||
|   "GlobalConfiguration": { | ||||
|     "RequestIdKey": "OcRequestId", | ||||
|   | ||||
| @@ -79,7 +79,7 @@ namespace Ocelot.UnitTests.Request | ||||
|             this.Given(x => x.GivenTheDownStreamUrlIs("any old string")) | ||||
|                 .And(x => x.GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(new NoQoSProvider()))) | ||||
|                 .And(x => x.GivenTheDownStreamRouteIs(downstreamRoute)) | ||||
|                 .And(x => x.GivenTheRequestBuilderReturns(new Ocelot.Request.Request(new HttpRequestMessage(), new CookieContainer(), true, new NoQoSProvider()))) | ||||
|                 .And(x => x.GivenTheRequestBuilderReturns(new Ocelot.Request.Request(new HttpRequestMessage(), true, new NoQoSProvider()))) | ||||
|                 .When(x => x.WhenICallTheMiddleware()) | ||||
|                 .Then(x => x.ThenTheScopedDataRepositoryIsCalledCorrectly()) | ||||
|                 .BDDfy(); | ||||
| @@ -104,8 +104,8 @@ namespace Ocelot.UnitTests.Request | ||||
|         { | ||||
|             _request = new OkResponse<Ocelot.Request.Request>(request); | ||||
|             _requestBuilder | ||||
|                 .Setup(x => x.Build(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<Stream>(), It.IsAny<IHeaderDictionary>(), | ||||
|                 It.IsAny<IRequestCookieCollection>(), It.IsAny<QueryString>(), It.IsAny<string>(), It.IsAny<Ocelot.RequestId.RequestId>(),It.IsAny<bool>(), It.IsAny<IQoSProvider>())) | ||||
|                 .Setup(x => x.Build(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<Stream>(), It.IsAny<IHeaderDictionary>(),  | ||||
|                 It.IsAny<QueryString>(), It.IsAny<string>(), It.IsAny<Ocelot.RequestId.RequestId>(),It.IsAny<bool>(), It.IsAny<IQoSProvider>())) | ||||
|                 .ReturnsAsync(_request); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -195,23 +195,6 @@ namespace Ocelot.UnitTests.Request | ||||
|             _qoSProvider = qoSProvider; | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void should_use_cookies() | ||||
|         { | ||||
|             this.Given(x => x.GivenIHaveHttpMethod("GET")) | ||||
|                .And(x => x.GivenIHaveDownstreamUrl("http://www.bbc.co.uk")) | ||||
|                .And(x => x.GivenTheCookiesAre(new RequestCookieCollection(new Dictionary<string, string> | ||||
|                { | ||||
|                    { "TheCookie","Monster" } | ||||
|                }))) | ||||
|                .When(x => x.WhenICreateARequest()) | ||||
|                .And(x => x.ThenTheCorrectCookiesAreUsed(new RequestCookieCollection(new Dictionary<string, string> | ||||
|                { | ||||
|                    { "TheCookie","Monster" } | ||||
|                }))) | ||||
|                .BDDfy(); | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void should_user_query_string() | ||||
|         { | ||||
| @@ -240,14 +223,14 @@ namespace Ocelot.UnitTests.Request | ||||
|  | ||||
|         private void ThenTheCorrectCookiesAreUsed(IRequestCookieCollection expected) | ||||
|         { | ||||
|             var resultCookies = _result.Data.CookieContainer.GetCookies(new Uri(_downstreamUrl + _query)); | ||||
|            /* var resultCookies = _result.Data.CookieContainer.GetCookies(new Uri(_downstreamUrl + _query)); | ||||
|             var resultDictionary = resultCookies.Cast<Cookie>().ToDictionary(cook => cook.Name, cook => cook.Value); | ||||
|  | ||||
|             foreach (var expectedCookie in expected) | ||||
|             { | ||||
|                 var resultCookie = resultDictionary[expectedCookie.Key]; | ||||
|                 resultCookie.ShouldBe(expectedCookie.Value); | ||||
|             } | ||||
|             }*/ | ||||
|         } | ||||
|  | ||||
|         private void GivenTheCookiesAre(IRequestCookieCollection cookies) | ||||
| @@ -305,7 +288,7 @@ namespace Ocelot.UnitTests.Request | ||||
|         private void WhenICreateARequest() | ||||
|         { | ||||
|             _result = _requestCreator.Build(_httpMethod, _downstreamUrl, _content?.ReadAsStreamAsync().Result, _headers, | ||||
|                 _cookies, _query, _contentType, _requestId,_isQos,_qoSProvider).Result; | ||||
|                 _query, _contentType, _requestId,_isQos,_qoSProvider).Result; | ||||
|         } | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -62,7 +62,7 @@ namespace Ocelot.UnitTests.Requester | ||||
|         [Fact] | ||||
|         public void should_call_scoped_data_repository_correctly() | ||||
|         { | ||||
|             this.Given(x => x.GivenTheRequestIs(new Ocelot.Request.Request(new HttpRequestMessage(),new CookieContainer(),true, new NoQoSProvider()))) | ||||
|             this.Given(x => x.GivenTheRequestIs(new Ocelot.Request.Request(new HttpRequestMessage(),true, new NoQoSProvider()))) | ||||
|                 .And(x => x.GivenTheRequesterReturns(new HttpResponseMessage())) | ||||
|                 .And(x => x.GivenTheScopedRepoReturns()) | ||||
|                 .When(x => x.WhenICallTheMiddleware()) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 TomPallister
					TomPallister