src/Event/Http/ApiPluginControllerCall.php line 50

Open in your IDE?
  1. <?php
  2. namespace App\Event\Http;
  3. use App\Controller\ApiPluginController;
  4. use App\Entity\ApiPluginCalls;
  5. use App\Service\Utils\CommonUtils;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  9. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  10. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. class ApiPluginControllerCall implements EventSubscriberInterface
  13. {
  14.     /**
  15.      * @var EntityManagerInterface
  16.      */
  17.     private $em;
  18.     const PARAM_KEY 'plugin_api_call_flaged';
  19.     public function __construct(EntityManagerInterface $entityManager)
  20.     {
  21.         $this->em $entityManager;
  22.     }
  23.     public function onKernelController(ControllerEvent $event)
  24.     {
  25.         $controller $event->getController();
  26.         // when a controller class defines multiple action methods, the controller
  27.         // is returned as [$controllerInstance, 'methodName']
  28.         if (is_array($controller)) {
  29.             $controller $controller[0];
  30.         }
  31.         if ($controller instanceof ApiPluginController) {
  32.             $event->getRequest()->attributes->set(self::PARAM_KEY'new');
  33. //            $token = $event->getRequest()->query->get('token');
  34. //            if (!in_array($token, $this->tokens)) {
  35. //                throw new AccessDeniedHttpException('This action needs a valid token!');
  36. //            }
  37.         }
  38.     }
  39.     public function onKernelResponse(ResponseEvent $event)
  40.     {
  41.         if (!$token $event->getRequest()->attributes->get(self::PARAM_KEY)) {
  42.             return;
  43.         }
  44.         if ($token !== 'new'){
  45.             return;
  46.         }
  47.         // when a controller class defines multiple action methods, the controller
  48.         // is returned as [$controllerInstance, 'methodName']
  49.         // check to see if onKernelController marked this as a token "auth'ed" request
  50.         $request $event->getRequest();
  51.         $response $event->getResponse();
  52.         try {
  53.             if ($response->getStatusCode() != 200 && ($request->getMethod() === 'POST' || $request->getMethod() === 'GET')) {
  54.                 //            file_put_contents('/tmp/dropped_data.log',json_encode([
  55.                 //                'request'=>$request->getContent(),
  56.                 //                'response'=>$response->getContent()
  57.                 //            ]));
  58.                 $ip CommonUtils::getClientIP($request);
  59.                 $droppedCall = (new ApiPluginCalls())
  60.                     ->setRequest(
  61.                         [
  62.                             'url' => $request->getUri(),
  63.                             'method' => $request->getMethod(),
  64.                             'data' => $request->getContent(),
  65.                             'ip' => $ip,
  66.                             'headers' => $request->headers,
  67.                         ]
  68.                     )
  69.                     ->setResponse(
  70.                         [
  71.                             'status' => $response->getStatusCode(),
  72.                             'content' => $response->getContent()
  73.                         ]
  74.                     );
  75.                 $this->em->persist($droppedCall);
  76.                 $this->em->flush();
  77.                 $event->getRequest()->attributes->set(self::PARAM_KEY$droppedCall->getId());
  78.             }
  79.         } catch (\Exception $e) {
  80.             file_put_contents('/tmp/dropped_data.log'PHP_EOL $e->getMessage(), FILE_APPEND);
  81.         }
  82.     }
  83.     public function onKernelRequestException(ExceptionEvent $event){
  84.         if (!$token $event->getRequest()->attributes->get(self::PARAM_KEY)) {
  85.             return;
  86.         }
  87.         // when a controller class defines multiple action methods, the controller
  88.         // is returned as [$controllerInstance, 'methodName']
  89.         // check to see if onKernelController marked this as a token "auth'ed" request
  90.         $request $event->getRequest();
  91.         $response $event->getResponse();
  92.         try {
  93.             $ip CommonUtils::getClientIP($request);
  94.             $droppedCall = (new ApiPluginCalls())
  95.                 ->setRequest(
  96.                     [
  97.                         'url' => $request->getUri(),
  98.                         'method' => $request->getMethod(),
  99.                         'data' => $request->getContent(),
  100.                         'ip' => $ip,
  101.                         'headers' => $request->headers,
  102.                     ]
  103.                 );
  104.             $resp_data = [];
  105.             if ($response && $response->getStatusCode() != 200 && ($request->getMethod() === 'POST' || $request->getMethod() === 'GET')) {
  106.                 $resp_data =
  107.                     [
  108.                         'status' => $response->getStatusCode(),
  109.                     ];
  110.             }
  111.             $resp_data['exception']=$event->getThrowable()->getMessage().PHP_EOL.
  112.                 "File {$event->getThrowable()->getFile()} Line {$event->getThrowable()->getLine()}".PHP_EOL.
  113.                 $event->getThrowable()->getTraceAsString();
  114.             $droppedCall->setResponse($resp_data);
  115.             $this->em->persist($droppedCall);
  116.             $this->em->flush();
  117.             $event->getRequest()->attributes->set(self::PARAM_KEY$droppedCall->getId());
  118.         } catch (\Exception $e) {
  119.             file_put_contents('/tmp/dropped_data.log'PHP_EOL $e->getMessage(), FILE_APPEND);
  120.         }
  121.     }
  122.     public static function getSubscribedEvents()
  123.     {
  124.         return [
  125.             KernelEvents::CONTROLLER => 'onKernelController',
  126.             KernelEvents::RESPONSE => 'onKernelResponse',
  127.             KernelEvents::EXCEPTION => 'onKernelRequestException',
  128.         ];
  129.     }
  130. }