shouldTrackRequest($request)) { $this->visitsTracker->track($shortUrl, Visitor::fromRequest($request)); } } public function trackNotFoundIfApplicable(ServerRequestInterface $request): void { if (! $this->shouldTrackRequest($request)) { return; } /** @var NotFoundType|null $notFoundType */ $notFoundType = $request->getAttribute(NotFoundType::class); $visitor = Visitor::fromRequest($request); match (true) { $notFoundType?->isBaseUrl() => $this->visitsTracker->trackBaseUrlVisit($visitor), $notFoundType?->isRegularNotFound() => $this->visitsTracker->trackRegularNotFoundVisit($visitor), $notFoundType?->isInvalidShortUrl() => $this->visitsTracker->trackInvalidShortUrlVisit($visitor), default => null, }; } private function shouldTrackRequest(ServerRequestInterface $request): bool { $forwardedMethod = $request->getAttribute(ImplicitHeadMiddleware::FORWARDED_HTTP_METHOD_ATTRIBUTE); if ($forwardedMethod === self::METHOD_HEAD) { return false; } $remoteAddr = ipAddressFromRequest($request); if ($this->shouldDisableTrackingFromAddress($remoteAddr)) { return false; } $query = $request->getQueryParams(); return ! $this->trackingOptions->queryHasDisableTrackParam($query); } private function shouldDisableTrackingFromAddress(?string $remoteAddr): bool { if ($remoteAddr === null || ! $this->trackingOptions->hasDisableTrackingFrom()) { return false; } try { return IpAddressUtils::ipAddressMatchesGroups($remoteAddr, $this->trackingOptions->disableTrackingFrom); } catch (InvalidIpFormatException) { return false; } } }