From 7bb6de763f38ddcbcbd3d2037f9150bf5b539840 Mon Sep 17 00:00:00 2001 From: Carl Schwan Date: Mon, 5 Oct 2026 15:38:06 +0200 Subject: [PATCH 1/2] fix: Add a synchronous fallback when loopback doesn't work Signed-off-by: Carl Schwan --- lib/Service/FederatedEventService.php | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/lib/Service/FederatedEventService.php b/lib/Service/FederatedEventService.php index 712799e87..3dd016765 100644 --- a/lib/Service/FederatedEventService.php +++ b/lib/Service/FederatedEventService.php @@ -55,6 +55,7 @@ use OCA\Circles\Tools\Model\Request; use OCA\Circles\Tools\Traits\TNCRequest; use OCA\Circles\Tools\Traits\TStringTools; +use OCP\AppFramework\Http; use OCP\AppFramework\Services\IAppConfig; use OCP\Server; use ReflectionClass; @@ -411,10 +412,44 @@ public function initBroadcast(FederatedEvent $event): bool { $this->e($e); } + if (!$isLoopbackTest && !$this->isLoopbackSuccessful($request)) { + Server::get(LoggerInterface::class)->warning( + 'Loopback request failed, processing event synchronously. Please check the loopback setup with occ circles:check', + ['url' => $request->getCompleteUrl(), 'status' => $request->hasResult() ? $request->getResult()->getStatusCode() : 0] + ); + $this->manageWrappersSynchronously($wrapper->getToken()); + } + return true; } + /** + * asyncBroadcast() closes the connection with an empty 200 before processing the event + */ + private function isLoopbackSuccessful(NCRequest $request): bool { + if (!$request->hasResult() || $request->getResult()->hasException()) { + return false; + } + + $result = $request->getResult(); + + return $result->getStatusCode() === Http::STATUS_OK && $result->getContent() === ''; + } + + /** + * same process as EventWrapperController::asyncBroadcast() + */ + private function manageWrappersSynchronously(string $token): void { + // EventWrapperService depends on this service + $eventWrapperService = Server::get(EventWrapperService::class); + foreach ($this->eventWrapperRequest->getByToken($token) as $wrapper) { + $eventWrapperService->manageWrapper($wrapper); + } + + $eventWrapperService->confirmStatus($token); + } + /** * @param FederatedEvent $event * From a3f93bd4eae8f14b5f56ad78fa9f23a451b53c21 Mon Sep 17 00:00:00 2001 From: Carl Schwan Date: Tue, 6 Oct 2026 13:22:40 +0200 Subject: [PATCH 2/2] fix: Add missing LoggerInterface import Signed-off-by: Carl Schwan --- lib/Service/FederatedEventService.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Service/FederatedEventService.php b/lib/Service/FederatedEventService.php index 3dd016765..13b59fd3a 100644 --- a/lib/Service/FederatedEventService.php +++ b/lib/Service/FederatedEventService.php @@ -58,6 +58,7 @@ use OCP\AppFramework\Http; use OCP\AppFramework\Services\IAppConfig; use OCP\Server; +use Psr\Log\LoggerInterface; use ReflectionClass; use ReflectionException;