endpoint_repository = $endpoint_repository; $this->endpoint_rate_limit_by_ip_repository = $endpoint_rate_limit_by_ip_repository; } /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @param int|string $maxAttempts * @param float|int $decayMinutes * @param string $prefix * @return \Symfony\Component\HttpFoundation\Response * * @throws \Illuminate\Http\Exceptions\ThrottleRequestsException */ public function handle($request, Closure $next, $maxAttempts = 60, $decayMinutes = 1, $prefix = '') { $route = RequestUtils::getCurrentRoutePath($request); $method = $request->getMethod(); $endpoint = $this->endpoint_repository->getApiEndpointByUrlAndMethod($route, $method); $key = $this->resolveRequestSignature($request); $client_ip = $request->getClientIp(); if (!is_null($endpoint) && $endpoint->getRateLimit() > 0) { $maxAttempts = $endpoint->getRateLimit(); } if (!is_null($endpoint) && $endpoint->getRateLimitDecay() > 0) { $decayMinutes = $endpoint->getRateLimitDecay(); } $endpoint_rate_limit_by_ip = $this->endpoint_rate_limit_by_ip_repository->getByIPRouteMethod ( $client_ip, $route, $method ); if(!is_null($endpoint_rate_limit_by_ip)){ $maxAttempts = $endpoint_rate_limit_by_ip->getRateLimit(); $decayMinutes = $endpoint_rate_limit_by_ip->getRateLimitDecay(); } if ($maxAttempts == 0 || $decayMinutes == 0) { // short circuit (infinite) return $next($request); } if ($this->limiter->tooManyAttempts($key, $maxAttempts)) { throw $this->buildException($key, $maxAttempts); } $this->limiter->hit($key, $decayMinutes); $response = $next($request); return $this->addHeaders( $response, $maxAttempts, $this->calculateRemainingAttempts($key, $maxAttempts) ); } }