/**
  * @param ClientHttpErrorEvent $event
  */
 public function onClientHttpErrorEvent(ClientHttpErrorEvent $event)
 {
     $response = $event->getResponse();
     $requestParams = $event->getRequestParams();
     $method = $event->getMethod();
     $url = $event->getUrl();
     switch ($response->getStatusCode()) {
         case 400:
             $class = BadRequestException::class;
             break;
         case 401:
             $class = AuthenticationException::class;
             break;
         case 403:
             $class = ForbiddenException::class;
             break;
         case 404:
             $class = NotFoundException::class;
             break;
         case 429:
             $class = ToManyRequestsException::class;
             break;
         case 500:
             $class = InternalApplicationException::class;
             break;
         default:
             $class = ApiException::class;
     }
     $statusCode = $response->getStatusCode();
     $date = current($response->getHeader('Date'));
     $requestId = current($response->getHeader('X-Request-Id'));
     $body = $response->getBody()->getContents();
     $decoded = json_decode($body, true);
     if (is_array($decoded)) {
         $errors = [];
         $messages = [];
         foreach ($decoded['error_messages'] as $field => $messageContexts) {
             foreach ($messageContexts as $messageContext) {
                 $errors[] = ['field' => $field, 'code' => $messageContext['code'], 'message' => $messageContext['message'], 'params' => $messageContext['params']];
                 $messages['message'] = $messageContext['message'];
             }
         }
         $message = implode('; ', $messages);
         $code = $decoded['error_code'];
     } else {
         $message = 'Invalid JSON describing error returned';
         $errors = null;
         $code = 0;
     }
     throw new $class($statusCode, $date, $requestId, $errors, $requestParams, $method, $url, $message, $code);
 }
 /**
  * @param ClientHttpErrorEvent $event
  */
 public function onClientHttpErrorEvent(ClientHttpErrorEvent $event)
 {
     //If we already are in intercepted response, don't do it again
     if ($this->intercepted) {
         return;
     }
     $response = $event->getResponse();
     if (401 !== $response->getStatusCode()) {
         return;
     }
     try {
         $this->intercepted = true;
         $this->authenticateEntryPoint->login();
         $originalRequest = $event->getOriginalRequest();
         $interceptedResponse = $this->client->request($originalRequest['method'], $originalRequest['uri'], $originalRequest['queryParams'], $originalRequest['requestParams'], $originalRequest['option'], $originalRequest['secured']);
         $event->setInterceptedResponse($interceptedResponse);
         $event->stopPropagation();
     } catch (Exception $e) {
         //Ignore any exception that got here
     } finally {
         $this->intercepted = false;
     }
 }