From fde4258a404024ddae0e12fac8543894b77cce2c Mon Sep 17 00:00:00 2001 From: Kevin Pfeifer Date: Sun, 9 Aug 2026 11:42:42 +0200 Subject: [PATCH] Fix Sentry capture scope isolation --- src/Http/SentryClient.php | 90 ++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/src/Http/SentryClient.php b/src/Http/SentryClient.php index d87a036..9eed8ca 100644 --- a/src/Http/SentryClient.php +++ b/src/Http/SentryClient.php @@ -122,22 +122,24 @@ public function captureException( ?ServerRequestInterface $request = null, ?array $extras = null, ): void { - $eventManager = $this->getEventManager(); - $event = new Event('CakeSentry.Client.beforeCapture', $this, compact('exception', 'request')); - $eventManager->dispatch($event); - - if ($extras !== null) { - $this->hub->configureScope(function (Scope $scope) use ($extras): void { - $scope->setExtras($extras); - }); - } + $this->hub->withScope(function () use ($exception, $request, $extras): void { + $eventManager = $this->getEventManager(); + $event = new Event('CakeSentry.Client.beforeCapture', $this, compact('exception', 'request')); + $eventManager->dispatch($event); + + if ($extras !== null) { + $this->hub->configureScope(function (Scope $scope) use ($extras): void { + $scope->setExtras($extras); + }); + } - $this->getQueryLoggers(); - $this->addQueryBreadcrumbs(); + $this->getQueryLoggers(); + $this->addQueryBreadcrumbs(); - $lastEventId = captureException($exception); - $event = new Event('CakeSentry.Client.afterCapture', $this, compact('exception', 'request', 'lastEventId')); - $eventManager->dispatch($event); + $lastEventId = captureException($exception); + $event = new Event('CakeSentry.Client.afterCapture', $this, compact('exception', 'request', 'lastEventId')); + $eventManager->dispatch($event); + }); } /** @@ -153,37 +155,39 @@ public function captureError( ?ServerRequestInterface $request = null, ?array $extras = null, ): void { - $eventManager = $this->getEventManager(); - $event = new Event('CakeSentry.Client.beforeCapture', $this, compact('error', 'request')); - $eventManager->dispatch($event); - - if ($extras !== null) { - $this->hub->configureScope(function (Scope $scope) use ($extras): void { - $scope->setExtras($extras); - }); - } + $this->hub->withScope(function () use ($error, $request, $extras): void { + $eventManager = $this->getEventManager(); + $event = new Event('CakeSentry.Client.beforeCapture', $this, compact('error', 'request')); + $eventManager->dispatch($event); + + if ($extras !== null) { + $this->hub->configureScope(function (Scope $scope) use ($extras): void { + $scope->setExtras($extras); + }); + } - $this->getQueryLoggers(); - $this->addQueryBreadcrumbs(); - - $client = $this->hub->getClient(); - if ($client) { - /** @var list $trace */ - $trace = $this->cleanedTrace($error->getTrace()); - $stacktrace = $client->getStacktraceBuilder() - ->buildFromBacktrace($trace, $error->getFile() ?? 'unknown file', $error->getLine() ?? 0); - $hint = EventHint::fromArray([ - 'stacktrace' => $stacktrace, - ]); - } + $this->getQueryLoggers(); + $this->addQueryBreadcrumbs(); + + $client = $this->hub->getClient(); + if ($client) { + /** @var list $trace */ + $trace = $this->cleanedTrace($error->getTrace()); + $stacktrace = $client->getStacktraceBuilder() + ->buildFromBacktrace($trace, $error->getFile() ?? 'unknown file', $error->getLine() ?? 0); + $hint = EventHint::fromArray([ + 'stacktrace' => $stacktrace, + ]); + } - $lastEventId = captureMessage( - $error->getMessage(), - Severity::fromError($error->getCode()), - $hint ?? null, - ); - $event = new Event('CakeSentry.Client.afterCapture', $this, compact('error', 'request', 'lastEventId')); - $eventManager->dispatch($event); + $lastEventId = captureMessage( + $error->getMessage(), + Severity::fromError($error->getCode()), + $hint ?? null, + ); + $event = new Event('CakeSentry.Client.afterCapture', $this, compact('error', 'request', 'lastEventId')); + $eventManager->dispatch($event); + }); } /**