コード例 #1
0
        public async Task Invoke(ITrafficContext trafficContext, BrolicTrafficDelegate next)
        {
            var endPoint = trafficContext.HttpContext.GetEndpoint();

            endPoint.RequestDelegate(trafficContext.HttpContext);
            await next(trafficContext);
        }
コード例 #2
0
        public async Task Invoke(ITrafficContext trafficContext, BrolicTrafficDelegate next)
        {
            var routeContext = new RouteContext(trafficContext.HttpContext);

            routeContext.RouteData.Routers.Add(_router);
            await _router.RouteAsync(routeContext);

            await routeContext.Handler(routeContext.HttpContext);

            await next(trafficContext);
        }
コード例 #3
0
        public BrolicTrafficDelegate Build()
        {
            BrolicTrafficDelegate application = trafficContext =>
            {
                trafficContext.HttpContext.Response.StatusCode = StatusCodes.Status404NotFound;
                return(Task.CompletedTask);
            };

            foreach (var middleware in _middlewares.Reverse())
            {
                application = middleware(application);
            }

            return(application);
        }
コード例 #4
0
        public async Task Invoke(ITrafficContext trafficContext, BrolicTrafficDelegate next)
        {
            var trafficInitiatorId = await _trafficInitiatorIdentifier.IdentifyTrafficInitiator(trafficContext);

            var httpContext = trafficContext.HttpContext;
            var httpMethod  = httpContext.Request.Method;
            var rateLimitingRouteOptions    = trafficContext.Route.GetRateLimitingRouteOptions();
            var applicableRateLimitingRules = rateLimitingRouteOptions.Rules
                                              .Where(r => !r.Methods.Any() || r.Methods.Contains(httpMethod));

            var rateLimitingValidationResponses = new List <RateLimitingValidationResponse>();

            foreach (var applicableRateLimitingRule in applicableRateLimitingRules)
            {
                var path         = httpContext.Request.Path;
                var parsedMethod = !applicableRateLimitingRule.Methods.Any()
                    ? "Any"
                    : applicableRateLimitingRule.Methods.Aggregate(string.Empty, (current, method) =>
                {
                    current += method;
                    return(current);
                });

                var rateLimitingValidationContext = new RateLimitingValidationContext
                {
                    TrafficInitiatorId = trafficInitiatorId,
                    Path   = path,
                    Method = parsedMethod,
                    Limit  = applicableRateLimitingRule.Limit,
                    Period = applicableRateLimitingRule.Period
                };
                var rateLimitingValidationResponse = await _rateLimitingValidationStrategy.ValidateContext(rateLimitingValidationContext);

                rateLimitingValidationResponses.Add(rateLimitingValidationResponse);
            }

            if (rateLimitingValidationResponses.Any(r => !r.IsValid))
            {
                httpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests;
                return;
            }

            await next(trafficContext);
        }
コード例 #5
0
 public async Task Invoke(ITrafficContext trafficContext, BrolicTrafficDelegate next)
 {
     var downstream     = trafficContext.Downstream;
     var trafficHandler = _trafficHandlerProvider.GetTrafficHandler(downstream.Handler);
     await trafficHandler.HandleTraffic(trafficContext);
 }