signalFor($request, $response->getStatusCode()); if ($signal !== null) { $location = $this->locationOf($request, $signal); $context = [ 'status' => $response->getStatusCode(), 'method' => $request->method(), 'path' => '/'.ltrim($request->path(), '/'), 'referer' => $this->refererPath($request), ]; defer(fn () => $this->errorSignal->report($signal, $location, $context)); } return $response; } private function signalFor(Request $request, int $status): ?string { return match (true) { $status === 404 && $this->hasInternalReferer($request) => ErrorSignal::DeadInternalLink, $status === 403 && $request->user() !== null => ErrorSignal::AccessDenied, $status === 419 => ErrorSignal::PageExpired, $status === 429 && $request->user() !== null => ErrorSignal::Throttled, default => null, }; } /** * Tote Links nach Pfad: auf der Haupt-Domain fängt die Catch-all-Route * `/{site}/{subsite?}/{product_slug?}` fast jeden Pfad — mit dem * Routennamen landeten alle toten Links in einem Eintrag. */ private function locationOf(Request $request, string $signal): string { if ($signal === ErrorSignal::DeadInternalLink) { return '/'.ltrim($request->path(), '/'); } $routeName = $request->route()?->getName(); return $routeName !== null ? $routeName : '/'.ltrim($request->path(), '/'); } private function hasInternalReferer(Request $request): bool { $referer = $request->headers->get('referer'); return is_string($referer) && parse_url($referer, PHP_URL_HOST) === $request->getHost(); } private function refererPath(Request $request): ?string { $referer = $request->headers->get('referer'); if (! is_string($referer) || $referer === '') { return null; } $path = parse_url($referer, PHP_URL_PATH); return is_string($path) ? ErrorReportScrubber::scrubPath($path) : null; } }