diff --git a/src/Ocelot/Configuration/Creator/FileOcelotConfigurationCreator.cs b/src/Ocelot/Configuration/Creator/FileOcelotConfigurationCreator.cs
index c5eababe..646af96c 100644
--- a/src/Ocelot/Configuration/Creator/FileOcelotConfigurationCreator.cs
+++ b/src/Ocelot/Configuration/Creator/FileOcelotConfigurationCreator.cs
@@ -117,12 +117,8 @@ namespace Ocelot.Configuration.Creator
rateLimitOption = new RateLimitOptions(enableRateLimiting, globalConfiguration.RateLimitOptions.ClientIdHeader,
fileReRoute.RateLimitOptions.ClientWhitelist, globalConfiguration.RateLimitOptions.DisableRateLimitHeaders,
globalConfiguration.RateLimitOptions.QuotaExceededMessage, globalConfiguration.RateLimitOptions.RateLimitCounterPrefix,
- new RateLimitRule()
- {
- Limit = fileReRoute.RateLimitOptions.Limit,
- Period = fileReRoute.RateLimitOptions.Period,
- PeriodTimespan = TimeSpan.FromSeconds(fileReRoute.RateLimitOptions.PeriodTimespan)
- }, globalConfiguration.RateLimitOptions.HttpStatusCode);
+ new RateLimitRule(fileReRoute.RateLimitOptions.Period, TimeSpan.FromSeconds(fileReRoute.RateLimitOptions.PeriodTimespan), fileReRoute.RateLimitOptions.Limit)
+ , globalConfiguration.RateLimitOptions.HttpStatusCode);
}
var serviceProviderPort = globalConfiguration?.ServiceDiscoveryProvider?.Port ?? 0;
diff --git a/src/Ocelot/Configuration/File/FileRateLimitOptions.cs b/src/Ocelot/Configuration/File/FileRateLimitOptions.cs
index 655b2442..afb3fab5 100644
--- a/src/Ocelot/Configuration/File/FileRateLimitOptions.cs
+++ b/src/Ocelot/Configuration/File/FileRateLimitOptions.cs
@@ -32,7 +32,7 @@ namespace Ocelot.Configuration.File
///
/// Gets or sets the HTTP Status code returned when rate limiting occurs, by default value is set to 429 (Too Many Requests)
///
- public int HttpStatusCode { get; private set; } = 429;
+ public int HttpStatusCode { get; set; } = 429;
}
diff --git a/src/Ocelot/Configuration/File/FileRateLimitRule.cs b/src/Ocelot/Configuration/File/FileRateLimitRule.cs
index 58d171de..727a9e82 100644
--- a/src/Ocelot/Configuration/File/FileRateLimitRule.cs
+++ b/src/Ocelot/Configuration/File/FileRateLimitRule.cs
@@ -25,7 +25,7 @@ namespace Ocelot.Configuration.File
///
public string Period { get; set; }
- public int PeriodTimespan { get; set; }
+ public double PeriodTimespan { get; set; }
///
/// Maximum number of requests that a client can make in a defined period
///
diff --git a/src/Ocelot/Configuration/RateLimitOptions.cs b/src/Ocelot/Configuration/RateLimitOptions.cs
index d5c68d23..85a3bf78 100644
--- a/src/Ocelot/Configuration/RateLimitOptions.cs
+++ b/src/Ocelot/Configuration/RateLimitOptions.cs
@@ -15,7 +15,7 @@ namespace Ocelot.Configuration
{
EnableRateLimiting = enbleRateLimiting;
ClientIdHeader = clientIdHeader;
- ClientWhitelist = clientWhitelist;
+ ClientWhitelist = clientWhitelist?? new List();
DisableRateLimitHeaders = disableRateLimitHeaders;
QuotaExceededMessage = quotaExceededMessage;
RateLimitCounterPrefix = rateLimitCounterPrefix;
@@ -62,15 +62,22 @@ namespace Ocelot.Configuration
public class RateLimitRule
{
- ///
- /// Rate limit period as in 1s, 1m, 1h
- ///
- public string Period { get; set; }
+ public RateLimitRule(string period, TimeSpan periodTimespan, long limit)
+ {
+ Period = period;
+ PeriodTimespan = periodTimespan;
+ Limit = limit;
+ }
- public TimeSpan? PeriodTimespan { get; set; }
+ ///
+ /// Rate limit period as in 1s, 1m, 1h,1d
+ ///
+ public string Period { get; private set; }
+
+ public TimeSpan PeriodTimespan { get; private set; }
///
/// Maximum number of requests that a client can make in a defined period
///
- public long Limit { get; set; }
+ public long Limit { get; private set; }
}
}
diff --git a/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs b/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs
index e83ad30c..446720ca 100644
--- a/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs
+++ b/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs
@@ -91,7 +91,7 @@ namespace Ocelot.DependencyInjection
// could maybe use a scoped data repository
services.AddSingleton();
services.AddScoped();
-
+ services.AddMemoryCache();
return services;
}
}
diff --git a/src/Ocelot/RateLimit/ClientRateLimitProcessor.cs b/src/Ocelot/RateLimit/ClientRateLimitProcessor.cs
index 38141b49..a2ee1202 100644
--- a/src/Ocelot/RateLimit/ClientRateLimitProcessor.cs
+++ b/src/Ocelot/RateLimit/ClientRateLimitProcessor.cs
@@ -1,4 +1,5 @@
-using Ocelot.Configuration;
+using Microsoft.AspNetCore.Http;
+using Ocelot.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -27,9 +28,9 @@ namespace Ocelot.RateLimit
return _core.RetryAfterFrom(timestamp, rule);
}
- public RateLimitHeaders GetRateLimitHeaders(ClientRequestIdentity requestIdentity, RateLimitOptions option)
+ public RateLimitHeaders GetRateLimitHeaders(HttpContext context, ClientRequestIdentity requestIdentity, RateLimitOptions option)
{
- return _core.GetRateLimitHeaders(requestIdentity, option);
+ return _core.GetRateLimitHeaders(context, requestIdentity, option);
}
}
diff --git a/src/Ocelot/RateLimit/ClientRequestIdentity.cs b/src/Ocelot/RateLimit/ClientRequestIdentity.cs
index 9cceeb9e..a27bc994 100644
--- a/src/Ocelot/RateLimit/ClientRequestIdentity.cs
+++ b/src/Ocelot/RateLimit/ClientRequestIdentity.cs
@@ -2,10 +2,17 @@
{
public class ClientRequestIdentity
{
- public string ClientId { get; set; }
+ public ClientRequestIdentity(string clientId, string path, string httpverb)
+ {
+ ClientId = clientId;
+ Path = path;
+ HttpVerb = httpverb;
+ }
- public string Path { get; set; }
+ public string ClientId { get; private set; }
- public string HttpVerb { get; set; }
+ public string Path { get; private set; }
+
+ public string HttpVerb { get; private set; }
}
}
\ No newline at end of file
diff --git a/src/Ocelot/RateLimit/Middleware/ClientRateLimitMiddleware.cs b/src/Ocelot/RateLimit/Middleware/ClientRateLimitMiddleware.cs
index 64ac40c0..4dbaeed1 100644
--- a/src/Ocelot/RateLimit/Middleware/ClientRateLimitMiddleware.cs
+++ b/src/Ocelot/RateLimit/Middleware/ClientRateLimitMiddleware.cs
@@ -72,9 +72,7 @@ namespace Ocelot.RateLimit.Middleware
//set X-Rate-Limit headers for the longest period
if (!options.DisableRateLimitHeaders)
{
- var headers = _processor.GetRateLimitHeaders(identity, options);
- headers.Context = context;
-
+ var headers = _processor.GetRateLimitHeaders( context,identity, options);
context.Response.OnStarting(SetRateLimitHeaders, state: headers);
}
@@ -89,21 +87,19 @@ namespace Ocelot.RateLimit.Middleware
clientId = httpContext.Request.Headers[option.ClientIdHeader].First();
}
- return new ClientRequestIdentity
- {
- Path = httpContext.Request.Path.ToString().ToLowerInvariant(),
- HttpVerb = httpContext.Request.Method.ToLowerInvariant(),
- ClientId = clientId,
- };
- }
+ return new ClientRequestIdentity(
+ clientId,
+ httpContext.Request.Path.ToString().ToLowerInvariant(),
+ httpContext.Request.Method.ToLowerInvariant()
+ );
+ }
public bool IsWhitelisted(ClientRequestIdentity requestIdentity, RateLimitOptions option)
{
- if (option.ClientWhitelist != null && option.ClientWhitelist.Contains(requestIdentity.ClientId))
+ if (option.ClientWhitelist.Contains(requestIdentity.ClientId))
{
return true;
}
-
return false;
}
diff --git a/src/Ocelot/RateLimit/RateLimitCore.cs b/src/Ocelot/RateLimit/RateLimitCore.cs
index 39904b06..07627f8d 100644
--- a/src/Ocelot/RateLimit/RateLimitCore.cs
+++ b/src/Ocelot/RateLimit/RateLimitCore.cs
@@ -1,8 +1,11 @@
-using Ocelot.Configuration;
+using Microsoft.AspNetCore.Http;
+using Ocelot.Configuration;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
+using System.Security.Cryptography;
+using System.Text;
using System.Threading.Tasks;
namespace Ocelot.RateLimit
@@ -19,11 +22,7 @@ namespace Ocelot.RateLimit
public RateLimitCounter ProcessRequest(ClientRequestIdentity requestIdentity, RateLimitOptions option)
{
- var counter = new RateLimitCounter
- {
- Timestamp = DateTime.UtcNow,
- TotalRequests = 1
- };
+ RateLimitCounter counter = new RateLimitCounter(DateTime.UtcNow, 1);
var rule = option.RateLimitRule;
var counterId = ComputeCounterKey(requestIdentity, option);
@@ -35,59 +34,57 @@ namespace Ocelot.RateLimit
if (entry.HasValue)
{
// entry has not expired
- if (entry.Value.Timestamp + rule.PeriodTimespan.Value >= DateTime.UtcNow)
+ if (entry.Value.Timestamp + rule.PeriodTimespan >= DateTime.UtcNow)
{
// increment request count
var totalRequests = entry.Value.TotalRequests + 1;
// deep copy
- counter = new RateLimitCounter
- {
- Timestamp = entry.Value.Timestamp,
- TotalRequests = totalRequests
- };
+ counter = new RateLimitCounter(entry.Value.Timestamp, totalRequests);
+
}
}
-
// stores: id (string) - timestamp (datetime) - total_requests (long)
- _counterHandler.Set(counterId, counter, rule.PeriodTimespan.Value);
+ _counterHandler.Set(counterId, counter, rule.PeriodTimespan);
}
return counter;
}
- public RateLimitHeaders GetRateLimitHeaders(ClientRequestIdentity requestIdentity, RateLimitOptions option)
+ public RateLimitHeaders GetRateLimitHeaders(HttpContext context, ClientRequestIdentity requestIdentity, RateLimitOptions option)
{
var rule = option.RateLimitRule;
- var headers = new RateLimitHeaders();
+ RateLimitHeaders headers = null;
var counterId = ComputeCounterKey(requestIdentity, option);
var entry = _counterHandler.Get(counterId);
if (entry.HasValue)
{
- headers.Reset = (entry.Value.Timestamp + ConvertToTimeSpan(rule.Period)).ToUniversalTime().ToString("o", DateTimeFormatInfo.InvariantInfo);
- headers.Limit = rule.Period;
- headers.Remaining = (rule.Limit - entry.Value.TotalRequests).ToString();
- }
+ headers = new RateLimitHeaders(context, rule.Period,
+ (rule.Limit - entry.Value.TotalRequests).ToString(),
+ (entry.Value.Timestamp + ConvertToTimeSpan(rule.Period)).ToUniversalTime().ToString("o", DateTimeFormatInfo.InvariantInfo)
+ );
+ }
else
{
- headers.Reset = (DateTime.UtcNow + ConvertToTimeSpan(rule.Period)).ToUniversalTime().ToString("o", DateTimeFormatInfo.InvariantInfo);
- headers.Limit = rule.Period;
- headers.Remaining = rule.Limit.ToString();
+ headers = new RateLimitHeaders(context,
+ rule.Period,
+ rule.Limit.ToString(),
+ (DateTime.UtcNow + ConvertToTimeSpan(rule.Period)).ToUniversalTime().ToString("o", DateTimeFormatInfo.InvariantInfo));
+
}
return headers;
- throw new NotImplementedException();
- }
+ }
public string ComputeCounterKey(ClientRequestIdentity requestIdentity, RateLimitOptions option)
{
var key = $"{option.RateLimitCounterPrefix}_{requestIdentity.ClientId}_{option.RateLimitRule.Period}_{requestIdentity.HttpVerb}_{requestIdentity.Path}";
- var idBytes = System.Text.Encoding.UTF8.GetBytes(key);
+ var idBytes = Encoding.UTF8.GetBytes(key);
byte[] hashBytes;
- using (var algorithm = System.Security.Cryptography.SHA1.Create())
+ using (var algorithm = SHA1.Create())
{
hashBytes = algorithm.ComputeHash(idBytes);
}
@@ -98,7 +95,7 @@ namespace Ocelot.RateLimit
public string RetryAfterFrom(DateTime timestamp, RateLimitRule rule)
{
var secondsPast = Convert.ToInt32((DateTime.UtcNow - timestamp).TotalSeconds);
- var retryAfter = Convert.ToInt32(rule.PeriodTimespan.Value.TotalSeconds);
+ var retryAfter = Convert.ToInt32(rule.PeriodTimespan.TotalSeconds);
retryAfter = retryAfter > 1 ? retryAfter - secondsPast : 1;
return retryAfter.ToString(System.Globalization.CultureInfo.InvariantCulture);
}
@@ -111,11 +108,16 @@ namespace Ocelot.RateLimit
switch (type)
{
- case "d": return TimeSpan.FromDays(double.Parse(value));
- case "h": return TimeSpan.FromHours(double.Parse(value));
- case "m": return TimeSpan.FromMinutes(double.Parse(value));
- case "s": return TimeSpan.FromSeconds(double.Parse(value));
- default: throw new FormatException($"{timeSpan} can't be converted to TimeSpan, unknown type {type}");
+ case "d":
+ return TimeSpan.FromDays(double.Parse(value));
+ case "h":
+ return TimeSpan.FromHours(double.Parse(value));
+ case "m":
+ return TimeSpan.FromMinutes(double.Parse(value));
+ case "s":
+ return TimeSpan.FromSeconds(double.Parse(value));
+ default:
+ throw new FormatException($"{timeSpan} can't be converted to TimeSpan, unknown type {type}");
}
}
diff --git a/src/Ocelot/RateLimit/RateLimitCounter.cs b/src/Ocelot/RateLimit/RateLimitCounter.cs
index f0133b25..42dd03b7 100644
--- a/src/Ocelot/RateLimit/RateLimitCounter.cs
+++ b/src/Ocelot/RateLimit/RateLimitCounter.cs
@@ -10,8 +10,14 @@ namespace Ocelot.RateLimit
///
public struct RateLimitCounter
{
- public DateTime Timestamp { get; set; }
+ public RateLimitCounter(DateTime timestamp, long totalRequest)
+ {
+ Timestamp = timestamp;
+ TotalRequests = totalRequest;
+ }
- public long TotalRequests { get; set; }
+ public DateTime Timestamp { get; private set; }
+
+ public long TotalRequests { get; private set; }
}
}
diff --git a/src/Ocelot/RateLimit/RateLimitHeaders.cs b/src/Ocelot/RateLimit/RateLimitHeaders.cs
index a7bd4ae6..909f656d 100644
--- a/src/Ocelot/RateLimit/RateLimitHeaders.cs
+++ b/src/Ocelot/RateLimit/RateLimitHeaders.cs
@@ -8,12 +8,20 @@ namespace Ocelot.RateLimit
{
public class RateLimitHeaders
{
- public HttpContext Context { get; set; }
+ public RateLimitHeaders(HttpContext context, string limit, string remaining, string reset)
+ {
+ Context = context;
+ Limit = limit;
+ Remaining = remaining;
+ Reset = reset;
+ }
- public string Limit { get; set; }
+ public HttpContext Context { get; private set; }
- public string Remaining { get; set; }
+ public string Limit { get; private set; }
- public string Reset { get; set; }
+ public string Remaining { get; private set; }
+
+ public string Reset { get; private set; }
}
}
diff --git a/test/Ocelot.AcceptanceTests/ClientRateLimitTests.cs b/test/Ocelot.AcceptanceTests/ClientRateLimitTests.cs
index 2e8c3c90..dc2b2b31 100644
--- a/test/Ocelot.AcceptanceTests/ClientRateLimitTests.cs
+++ b/test/Ocelot.AcceptanceTests/ClientRateLimitTests.cs
@@ -67,7 +67,9 @@ namespace Ocelot.AcceptanceTests
ClientIdHeader = "ClientId",
DisableRateLimitHeaders = false,
QuotaExceededMessage = "",
- RateLimitCounterPrefix = ""
+ RateLimitCounterPrefix = "",
+ HttpStatusCode = 428
+
},
RequestIdKey ="oceclientrequest"
}
@@ -76,8 +78,12 @@ namespace Ocelot.AcceptanceTests
this.Given(x => x.GivenThereIsAServiceRunningOn("http://localhost:51879/api/ClientRateLimit"))
.And(x => _steps.GivenThereIsAConfiguration(configuration))
.And(x => _steps.GivenOcelotIsRunning())
- .When(x => _steps.WhenIGetUrlOnTheApiGatewayMultipleTimesForRateLimit("/api/ClientRateLimit", 5))
- .Then(x => _steps.ThenTheStatusCodeShouldBe(429))
+ .When(x => _steps.WhenIGetUrlOnTheApiGatewayMultipleTimesForRateLimit("/api/ClientRateLimit",1))
+ .Then(x => _steps.ThenTheStatusCodeShouldBe(200))
+ .When(x => _steps.WhenIGetUrlOnTheApiGatewayMultipleTimesForRateLimit("/api/ClientRateLimit", 2))
+ .Then(x => _steps.ThenTheStatusCodeShouldBe(200))
+ .When(x => _steps.WhenIGetUrlOnTheApiGatewayMultipleTimesForRateLimit("/api/ClientRateLimit",1))
+ .Then(x => _steps.ThenTheStatusCodeShouldBe(428))
.BDDfy();
}
@@ -154,55 +160,6 @@ namespace Ocelot.AcceptanceTests
_builder.Start();
}
- //private void GetApiRateLimait(string url)
- //{
- // var clientId = "ocelotclient1";
- // var request = new HttpRequestMessage(new HttpMethod("GET"), url);
- // request.Headers.Add("ClientId", clientId);
-
- // var response = _client.SendAsync(request);
- // responseStatusCode = (int)response.Result.StatusCode;
- // }
-
- //}
-
- //public void WhenIGetUrlOnTheApiGatewayMultipleTimes(string url, int times)
- //{
- // var clientId = "ocelotclient1";
- // var tasks = new Task[times];
-
- // for (int i = 0; i < times; i++)
- // {
- // var urlCopy = url;
- // tasks[i] = GetForServiceDiscoveryTest(urlCopy);
- // Thread.Sleep(_random.Next(40, 60));
- // }
-
- // Task.WaitAll(tasks);
- //}
-
- //private void WhenICallTheMiddlewareWithWhiteClient()
- //{
- // var clientId = "ocelotclient2";
- // // Act
- // for (int i = 0; i < 2; i++)
- // {
- // var request = new HttpRequestMessage(new HttpMethod("GET"), apiRateLimitPath);
- // request.Headers.Add("ClientId", clientId);
-
- // var response = _client.SendAsync(request);
- // responseStatusCode = (int)response.Result.StatusCode;
- // }
- //}
-
- //private void ThenresponseStatusCodeIs429()
- //{
- // responseStatusCode.ShouldBe(429);
- //}
-
- //private void ThenresponseStatusCodeIs200()
- //{
- // responseStatusCode.ShouldBe(200);
- //}
+
}
}
\ No newline at end of file
diff --git a/test/Ocelot.AcceptanceTests/Steps.cs b/test/Ocelot.AcceptanceTests/Steps.cs
index 5981c343..ebced901 100644
--- a/test/Ocelot.AcceptanceTests/Steps.cs
+++ b/test/Ocelot.AcceptanceTests/Steps.cs
@@ -101,7 +101,6 @@ namespace Ocelot.AcceptanceTests
})
.WithDictionaryHandle();
};
- s.AddMemoryCache();
s.AddOcelotOutputCaching(settings);
s.AddOcelotFileConfiguration(configuration);
s.AddOcelot();
diff --git a/test/Ocelot.AcceptanceTests/configuration.json b/test/Ocelot.AcceptanceTests/configuration.json
index af289aab..0a65abc2 100755
--- a/test/Ocelot.AcceptanceTests/configuration.json
+++ b/test/Ocelot.AcceptanceTests/configuration.json
@@ -1 +1 @@
-{"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,"RateLimitOptions":{"ClientWhitelist":[],"EnableRateLimiting":false,"Period":null,"PeriodTimespan":0,"Limit":0}}],"GlobalConfiguration":{"RequestIdKey":null,"ServiceDiscoveryProvider":{"Provider":null,"Host":null,"Port":0},"RateLimitOptions":{"ClientIdHeader":"ClientId","QuotaExceededMessage":null,"RateLimitCounterPrefix":"ocelot","DisableRateLimitHeaders":false,"HttpStatusCode":429}}}
\ No newline at end of file
+{"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,"RateLimitOptions":{"ClientWhitelist":[],"EnableRateLimiting":false,"Period":null,"PeriodTimespan":0.0,"Limit":0}}],"GlobalConfiguration":{"RequestIdKey":null,"ServiceDiscoveryProvider":{"Provider":null,"Host":null,"Port":0},"RateLimitOptions":{"ClientIdHeader":"ClientId","QuotaExceededMessage":null,"RateLimitCounterPrefix":"ocelot","DisableRateLimitHeaders":false,"HttpStatusCode":429}}}
\ No newline at end of file
diff --git a/test/Ocelot.AcceptanceTests/project.json b/test/Ocelot.AcceptanceTests/project.json
index 5457280f..2dd3094e 100644
--- a/test/Ocelot.AcceptanceTests/project.json
+++ b/test/Ocelot.AcceptanceTests/project.json
@@ -23,7 +23,6 @@
"Microsoft.AspNetCore.Http": "1.1.0",
"Microsoft.DotNet.InternalAbstractions": "1.0.0",
"Ocelot": "0.0.0-dev",
- "xunit": "2.2.0-beta2-build3300",
"dotnet-test-xunit": "2.2.0-preview2-build1029",
"Ocelot.ManualTest": "0.0.0-dev",
"Microsoft.AspNetCore.TestHost": "1.1.0",
@@ -34,7 +33,8 @@
"Shouldly": "2.8.2",
"TestStack.BDDfy": "4.3.2",
"Consul": "0.7.2.1",
- "Microsoft.Extensions.Caching.Memory": "1.1.0"
+ "Microsoft.Extensions.Caching.Memory": "1.1.0",
+ "xunit": "2.2.0-rc1-build3507"
},
"runtimes": {
"win10-x64": {},
diff --git a/test/Ocelot.ManualTest/Startup.cs b/test/Ocelot.ManualTest/Startup.cs
index 2d8b7653..767aed43 100644
--- a/test/Ocelot.ManualTest/Startup.cs
+++ b/test/Ocelot.ManualTest/Startup.cs
@@ -37,7 +37,6 @@ namespace Ocelot.ManualTest
})
.WithDictionaryHandle();
};
- services.AddMemoryCache();
services.AddOcelotOutputCaching(settings);
services.AddOcelotFileConfiguration(Configuration);
services.AddOcelot();
diff --git a/test/Ocelot.UnitTests/RateLimit/ClientRateLimitMiddlewareTests.cs b/test/Ocelot.UnitTests/RateLimit/ClientRateLimitMiddlewareTests.cs
index 11bca113..72f66faa 100644
--- a/test/Ocelot.UnitTests/RateLimit/ClientRateLimitMiddlewareTests.cs
+++ b/test/Ocelot.UnitTests/RateLimit/ClientRateLimitMiddlewareTests.cs
@@ -20,6 +20,7 @@ using Xunit;
using TestStack.BDDfy;
using Ocelot.Configuration.Builder;
using Shouldly;
+using Ocelot.Configuration;
namespace Ocelot.UnitTests.RateLimit
{
@@ -70,11 +71,13 @@ namespace Ocelot.UnitTests.RateLimit
{
var downstreamRoute = new DownstreamRoute(new List(),
new ReRouteBuilder().WithEnableRateLimiting(true).WithRateLimitOptions(
- new Ocelot.Configuration.RateLimitOptions(true, "ClientId", new List(), false, "", "", new Ocelot.Configuration.RateLimitRule() { Limit = 3, Period = "1s", PeriodTimespan = TimeSpan.FromSeconds(100) },429))
+ new Ocelot.Configuration.RateLimitOptions(true, "ClientId", new List(), false, "", "", new Ocelot.Configuration.RateLimitRule("1s", TimeSpan.FromSeconds(100), 3), 429))
.Build());
this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute))
- .When(x => x.WhenICallTheMiddleware())
+ .When(x => x.WhenICallTheMiddlewareMultipleTime(2))
+ .Then(x => x.ThenresponseStatusCodeIs200())
+ .When(x => x.WhenICallTheMiddlewareMultipleTime(2))
.Then(x => x.ThenresponseStatusCodeIs429())
.BDDfy();
}
@@ -84,7 +87,7 @@ namespace Ocelot.UnitTests.RateLimit
{
var downstreamRoute = new DownstreamRoute(new List(),
new ReRouteBuilder().WithEnableRateLimiting(true).WithRateLimitOptions(
- new Ocelot.Configuration.RateLimitOptions(true, "ClientId", new List() { "ocelotclient2" }, false, "", "", new Ocelot.Configuration.RateLimitRule() { Limit = 3, Period = "1s", PeriodTimespan = TimeSpan.FromSeconds(100) },429))
+ new Ocelot.Configuration.RateLimitOptions(true, "ClientId", new List() { "ocelotclient2" }, false, "", "", new RateLimitRule( "1s", TimeSpan.FromSeconds(100),3),429))
.Build());
this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute))
@@ -102,11 +105,11 @@ namespace Ocelot.UnitTests.RateLimit
.Returns(_downstreamRoute);
}
- private void WhenICallTheMiddleware()
+ private void WhenICallTheMiddlewareMultipleTime(int times)
{
var clientId = "ocelotclient1";
// Act
- for (int i = 0; i <10; i++)
+ for (int i = 0; i < times; i++)
{
var request = new HttpRequestMessage(new HttpMethod("GET"), _url);
request.Headers.Add("ClientId", clientId);
diff --git a/test/Ocelot.UnitTests/project.json b/test/Ocelot.UnitTests/project.json
index 3151ac57..2f42c283 100644
--- a/test/Ocelot.UnitTests/project.json
+++ b/test/Ocelot.UnitTests/project.json
@@ -14,7 +14,6 @@
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0",
"Microsoft.AspNetCore.Http": "1.1.0",
"Ocelot": "0.0.0-dev",
- "xunit": "2.2.0-beta2-build3300",
"dotnet-test-xunit": "2.2.0-preview2-build1029",
"Moq": "4.6.38-alpha",
"Microsoft.AspNetCore.TestHost": "1.1.0",
@@ -24,7 +23,8 @@
"Shouldly": "2.8.2",
"TestStack.BDDfy": "4.3.2",
"Microsoft.AspNetCore.Authentication.OAuth": "1.1.0",
- "Microsoft.DotNet.InternalAbstractions": "1.0.0"
+ "Microsoft.DotNet.InternalAbstractions": "1.0.0",
+ "xunit": "2.2.0-rc1-build3507"
},
"runtimes": {
"win10-x64": {},