public async Task PolicyDirectlyOnEndpoint_GetsUsed() { var globalOnRejectedInvoked = false; var options = CreateOptionsAccessor(); // Policy will disallow var policy = new TestRateLimiterPolicy("myKey", 404, false); var defaultRateLimiterPolicy = new DefaultRateLimiterPolicy(RateLimiterOptions.ConvertPartitioner <string>(null, policy.GetPartition), policy.OnRejected); options.Value.OnRejected = (context, token) => { globalOnRejectedInvoked = true; context.HttpContext.Response.StatusCode = 429; return(ValueTask.CompletedTask); }; var middleware = new RateLimitingMiddleware(c => { return(Task.CompletedTask); }, new NullLoggerFactory().CreateLogger <RateLimitingMiddleware>(), options, Mock.Of <IServiceProvider>()); var context = new DefaultHttpContext(); context.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(defaultRateLimiterPolicy)), "Test endpoint")); await middleware.Invoke(context).DefaultTimeout(); Assert.False(globalOnRejectedInvoked); Assert.Equal(StatusCodes.Status404NotFound, context.Response.StatusCode); }
/// <summary> /// Adds the specified rate limiting policy to the endpoint(s). /// </summary> /// <param name="builder">The endpoint convention builder.</param> /// <param name="policy">The rate limiting policy to add to the endpoint.</param> /// <returns>The original convention builder parameter.</returns> public static TBuilder RequireRateLimiting <TBuilder, TPartitionKey>(this TBuilder builder, IRateLimiterPolicy <TPartitionKey> policy) where TBuilder : IEndpointConventionBuilder { ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(policy); builder.Add(endpointBuilder => { endpointBuilder.Metadata.Add(new EnableRateLimitingAttribute(new DefaultRateLimiterPolicy(RateLimiterOptions.ConvertPartitioner <TPartitionKey>(null, policy.GetPartition), policy.OnRejected))); }); return(builder); }