<?php namespace App\EventListener;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
class ClientErrorListener
{
protected $logger;
public function __construct(LoggerInterface $logger) {
$this->logger = $logger;
}
public function onKernelException(ExceptionEvent $event)
{
// You get the exception object from the received event
$exception = $event->getThrowable();
$message = $exception->getMessage();
$response = null;
if ($exception instanceof \AdScore\Common\Gearboy\RoutineError) {
/* Common case: Routine returned a logic error */
$response = new JsonResponse([
'status' => 'error',
'errors' => [
array_filter(['fields' => $exception->getFields(), 'message' => $exception->getMessage(), 'code' => $exception->getCode()])
]
], JsonResponse::HTTP_BAD_REQUEST);
} elseif ($exception instanceof \AdScore\Common\Exception\BreakpointException) {
$response = new JsonResponse(['status' => 'breakpoint', 'file' => $exception->getFile(), 'line' => $exception->getLine(), 'dump' => $exception->getDump()], 451);
} elseif (($exception instanceof \App\Component\Report\Exception\ReportErrorInterface) || ($exception instanceof \App\Component\Report\Exception\ReportExceptionInterface)) {
/* Known errors caused by request data */
$response = new JsonResponse(['status' => 'error', 'errors' => [['message' => $message]]], 400);
} elseif ($exception instanceof \App\Component\HttpFoundation\PayloadValidationException) {
/* Known errors caused by request data */
$response = new JsonResponse(['status' => 'error', 'errors' => $exception->getErrors()], 400);
} elseif ($exception instanceof \AdScore\Traffic\Utils\RequestError) {
/* Known errors caused by request data */
$response = new JsonResponse(['status' => 'error', 'errors' => [[
'message' => $message,
'code' => 11000 + ($exception->getCode() % 100)
]]], 400);
} elseif ((stripos($event->getRequest()->getClientIp(), '172.16.') !== 0) && (($exception->getCode() >= 400) && ($exception->getCode() <= 600))) {
/* Various errors with assigned HTTP codes (with exception to privnet) */
$response = new JsonResponse(['status' => 'error', 'errors' => [['message' => $message]]], $exception->getCode());
} elseif ($exception instanceof \Symfony\Component\HttpKernel\Exception\HttpException) {
/* Errors directly marked as HTTP emittable */
if (empty($message) || (strlen($message) > 48))
$message = JsonResponse::$statusTexts[$exception->getStatusCode()];
$response = new JsonResponse(['status' => 'error', 'errors' => [['message' => $message]]], $exception->getStatusCode());
}
if (!empty($response))
$event->setResponse($response);
}
}