/** * @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; } }