app/GraphQL/EventSubscriber/GraphQLExceptionSubscriber.php line 32

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Sq\GraphQL\EventSubscriber;
  3. use Sq\GraphQL\Exception\SqGraphQLException;
  4. use Sq\Service\Environment;
  5. use Sq\Service\Log\ExceptionLogger;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  10. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. use Symfony\Component\Routing\Exception\ResourceNotFoundException;
  13. class GraphQLExceptionSubscriber implements EventSubscriberInterface
  14. {
  15.     public function __construct(
  16.         protected Environment $environment,
  17.         protected ExceptionLogger $exceptionLogger,
  18.     ) {
  19.     }
  20.     /** @inheritDoc */
  21.     public static function getSubscribedEvents(): array
  22.     {
  23.         return [
  24.             KernelEvents::EXCEPTION => ['onException'],
  25.         ];
  26.     }
  27.     public function onException(ExceptionEvent $event): void
  28.     {
  29.         $throwable $event->getThrowable();
  30.         $request $event->getRequest();
  31.         is_graphql_request($request) && $event->setResponse(static::createInternalServerErrorGraphQLResponse($this->environment->isDebug(), $throwable));
  32.         if ($throwable instanceof NotFoundHttpException || $throwable instanceof ResourceNotFoundException)
  33.         {
  34.             return;
  35.         }
  36.         if ($throwable instanceof \RuntimeException && str_contains($throwable->getMessage(), 'Invalid JSON received in POST body'))
  37.         {
  38.             $this->exceptionLogger->logInvalidJsonRequest(
  39.                 $throwable,
  40.                 $request->getContent(),
  41.                 $request->headers->all(),
  42.                 $request->getClientIp(),
  43.                 $request->server->get('HTTP_USER_AGENT')
  44.             );
  45.             return;
  46.         }
  47.         $this->exceptionLogger->logInternalServerError($event->getThrowable());
  48.     }
  49.     public static function createInternalServerErrorGraphQLResponse($debug false, ?\Throwable $e null): Response
  50.     {
  51.         $error = new \GraphQL\Error\Error("INTERNAL_SERVER_ERROR");
  52.         $res = new \GraphQL\Executor\ExecutionResult(null, [$error]);
  53.         $resArray $res->toArray();
  54.         if ($e instanceof SqGraphQLException)
  55.         {
  56.             $resArray['errors'][0]['extensions']['gql_message'] = $e->getMessage();
  57.         }
  58.         if ($debug && $e)
  59.         {
  60.             if ($e->getPrevious())
  61.             {
  62.                 $previous $e->getPrevious();
  63.                 $resArray['errors'][0]['debug_previous'] = [
  64.                     'message' => $previous->getMessage(),
  65.                     'code' => $previous->getCode(),
  66.                     'line' => $previous->getLine(),
  67.                     'file' => $previous->getFile(),
  68.                 ];
  69.             }
  70.             $resArray['errors'][0]['debug_message'] = $e->getMessage();
  71.             $resArray['errors'][0]['debug_file'] = $e->getFile();
  72.             $resArray['errors'][0]['debug_line'] = $e->getLine();
  73.             $resArray['errors'][0]['debug_trace'] = $e->getTraceAsString();
  74.         }
  75.         return new JsonResponse($resArray500);
  76.     }
  77. }