src/Subscriber/HttpClientSubscriber.php line 82

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Subscriber;
  4. use App\Event\HttpClient\Events;
  5. use App\Event\HttpClient\HttpClientRequestEvent;
  6. use App\Event\HttpClient\HttpClientResponseEvent;
  7. use App\Payment\Provider\Basys\BasysClient;
  8. use App\Service\Graph\ContainerTraversablePathAccess;
  9. use Psr\Log\LoggerInterface;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. class HttpClientSubscriber implements EventSubscriberInterface
  12. {
  13.     const HTTP_ERROR_CODES_REGEX '/(^5\\d{2}$)|(^4\\d{2}$)/';
  14.     private LoggerInterface $logger;
  15.     public function __construct(LoggerInterface $restLogger)
  16.     {
  17.         $this->logger $restLogger;
  18.     }
  19.     public static function getSubscribedEvents(): array
  20.     {
  21.         return [
  22.             Events::HTTP_CALL_OUTGOING => 'onRequest',
  23.             Events::HTTP_CALL_INCOMING => 'onResponse',
  24.         ];
  25.     }
  26.     public function onRequest(HttpClientRequestEvent $requestEvent)
  27.     {
  28.         $request $requestEvent->getRequest();
  29.         $data $this->getMaskedBody($requestEvent);
  30.         $this->logger->info(\sprintf('[HTTP: REQUEST] [%s] %s %s with query parameters %s and body %s and headers %s',
  31.             $requestEvent->getRequestIdentifier(),
  32.             $requestEvent->getMethod(),
  33.             $request->getUrl(),
  34.             \http_build_query($request->getParameters() ?? []),
  35.             \is_array($data) ? \json_encode($data) : $data,
  36.             \json_encode($request->getHeaders())
  37.         ));
  38.     }
  39.     private function getMaskedBody(HttpClientRequestEvent $requestEvent)
  40.     {
  41.         if ($requestEvent->getContext() == BasysClient::PROVIDER_NAME) {
  42.             $data $requestEvent->getRequest()->getBody();
  43.             if (empty($data)) {
  44.                 return $data;
  45.             }
  46.             $containerTraversablePathAccess = new ContainerTraversablePathAccess(
  47.                 is_array($data) ? $data json_decode($datatrue)
  48.                 , false);
  49.             if (
  50.                 $containerTraversablePathAccess->getByPath('payment_method.card.cvc'false) !== false
  51.                 || $containerTraversablePathAccess->getByPath('payment_method.card.expiration_date'false) !== false
  52.                 || $containerTraversablePathAccess->getByPath('payment_method.card.number'false) !== false
  53.             ) {
  54.                 $data is_array($data) ? $data json_decode($datatrue);
  55.                 $data['payment_method']['card']['number'] = '***HIDE*FOR*LOGS***';
  56.                 $data['payment_method']['card']['cvc'] = '***HIDE*FOR*LOGS***';
  57.                 $data['payment_method']['card']['expiration_date'] = '***HIDE*FOR*LOGS***';
  58.             }
  59.             return $data;
  60.         }
  61.         return $requestEvent->getRequest()->getBody();
  62.     }
  63.     public function onResponse(HttpClientResponseEvent $responseEvent)
  64.     {
  65.         $response $responseEvent->getResponse();
  66.         if (preg_match(self::HTTP_ERROR_CODES_REGEX, (string)$response->getStatusCode())) {
  67.             $this->logger->error(\sprintf('[HTTP: RESPONSE] [%s] Response with status code \'%s\' and body \'%s\'',
  68.                 $responseEvent->getRequestIdentifier(),
  69.                 $response->getStatusCode(),
  70.                 $response->getRawBody()
  71.             ));
  72.         } else {
  73.             $this->logger->info(\sprintf('[HTTP: RESPONSE] [%s] Response with status code \'%s\' and body \'%s\'',
  74.                 $responseEvent->getRequestIdentifier(),
  75.                 $response->getStatusCode(),
  76.                 $response->getRawBody()
  77.             ));
  78.         }
  79.     }
  80. }