/** * @internal * * @param ProcessEvent $event */ public function onProcess(ProcessEvent $event) { // Decode the JSON response $data = ''; try { $data = $event->getResponse()->getBody()->getContents(); $json = $event->getResponse()->json(); } catch (\RuntimeException $e) { // Invalid response; make our own error message $json = ['ok' => $data === 'ok', 'error' => $data]; } if (!isset($json['ok']) || $json['ok'] === false) { throw new SlackApiException($json['error'], $event->getTransaction()); } }
/** * @param ProcessEvent $event */ public function onProcess(ProcessEvent $event) { $jsonResponse = $event->getResponse()->json(); if (is_array($jsonResponse) && array_key_exists('error', $jsonResponse) && array_key_exists('errorcode', $jsonResponse)) { throw new BadResponseException($jsonResponse['error'], $event->getRequest()); } }
/** * @internal * @param ProcessEvent $event */ public function handleError(ProcessEvent $event) { if (!($exception = $event->getException())) { return; } $name = $event->getCommand()->getName(); $operation = $event->getClient()->getDescription()->getOperation($name); $errors = $operation->getErrorResponses(); $response = $event->getResponse(); // We iterate through each errors in service description. If the descriptor contains both a phrase and // status code, there must be an exact match of both. Otherwise, a match of status code is enough $bestException = null; foreach ($errors as $error) { $code = (int) $error['code']; if ($response->getStatusCode() !== $code) { continue; } if (isset($error['phrase']) && !($error['phrase'] === $response->getReasonPhrase())) { continue; } $bestException = $error['class']; // If there is an exact match of phrase + code, then we cannot find a more specialized exception in // the array, so we can break early instead of iterating the remaining ones if (isset($error['phrase'])) { break; } } if (null !== $bestException) { throw new $bestException($response->getReasonPhrase(), $event->getTransaction(), $exception); } // If we reach here, no exception could be match from descriptor, and Guzzle exception will propagate }
public function checkForPermanentRedirect(ProcessEvent $e) { $res = $e->getResponse(); if ($res && $res->getStatusCode() == 301) { throw new PermanentRedirectException('Encountered a permanent redirect while requesting ' . $e->getRequest()->getUrl(), $e->getTransaction()); } }
/** * @param Operation $operation * @param ProcessEvent $event * @return ResponseInterface */ public static function fromOperation(Operation $operation, ProcessEvent $event) { $operationConfig = $operation->toArray(); if (!isset($operationConfig['responseDataRoot'])) { throw new Exception\RuntimeException(sprintf('No response data root configured for operation "%s"', $operation->getName())); } return new static($event->getResponse(), $operationConfig['responseDataRoot']); }
public function testHasData() { $command = $this->getMock('GuzzleHttp\\Command\\CommandInterface'); $client = $this->getMock('GuzzleHttp\\Command\\ServiceClientInterface'); $trans = new CommandTransaction($client, $command); $request = new Request('GET', 'http://httbin.org'); $response = new Response(200); $trans->setRequest($request); $trans->setResponse($response); $event = new ProcessEvent($trans); $this->assertSame($command, $event->getCommand()); $this->assertSame($client, $event->getClient()); $this->assertSame($request, $event->getRequest()); $this->assertSame($response, $event->getResponse()); $this->assertSame($trans, $event->getTransaction()); $this->assertNull($event->getResult()); }
protected function visit(Parameter $model, ProcessEvent $event) { $result = []; $context = ['client' => $event->getClient(), 'visitors' => []]; $command = $event->getCommand(); $response = $event->getResponse(); if ($model->getType() == 'object') { $this->visitOuterObject($model, $result, $command, $response, $context); } elseif ($model->getType() == 'array') { $this->visitOuterArray($model, $result, $command, $response, $context); } else { throw new \InvalidArgumentException('Invalid response model: ' . $model->getType()); } // Call the after() method of each found visitor foreach ($context['visitors'] as $visitor) { $visitor->after($command, $response, $model, $result, $context); } return $result; }
/** * Callback for process event. */ public function onProcess(ProcessEvent $event) { $response = $event->getResponse(); // var_dump((string) $event->getRequest()); // var_dump((string) $response); if (!$response) { return; } try { $json = $response->json(); } catch (\RuntimeException $e) { return; } if (NULL === $response || $json['success']) { return; } $command = $event->getCommand(); $message = ''; $this->operation = $this->description->getOperation($command->getName()); // string, // simple array, // assoc array. $errors = $json['errors']; $category = $this->operation->getParam('modelName')->getDefault(); $method = $this->operation->getName(); $suffix = " on {$category} operation { {$method} }"; if (is_string($errors)) { $message = 'Common error: "' . $errors . '"' . $suffix; } elseif (is_array($errors)) { $keys = array_keys($errors); $message = $errors[$keys[0]]; $property = $keys[0]; $alias = $this::getParamBySentAs($keys[0]); if ($alias) { $message = str_replace($property, $alias, $message); } $message = 'Error: "' . $message . '"' . $suffix; } $e = new NpErrorException($message, $event->getTransaction()); $e->setCategory($category); $e->setVerboseMessage($message); throw $e; }
public function onProcess(ProcessEvent $event) { $response = $event->getResponse(); if (!$response) { return; } try { $xml = $response->xml(); } catch (\RuntimeException $e) { return; } $eanError = $xml->EanError ?: $xml->EanWsError; if ($eanError) { $e = new EanErrorException((string) $eanError->presentationMessage, $event->getTransaction()); $e->setHandling((string) $eanError->handling); $e->setCategory((string) $eanError->category); $e->setVerboseMessage((string) $eanError->verboseMessage); $e->setItineraryId((string) $eanError->itineraryId); throw $e; } }
/** * @param ProcessEvent $event * @return ResponseInterface|null */ protected function createResult(ProcessEvent $event) { // Only add a result object if no exception was encountered. if ($event->getException()) { return null; } $command = $event->getCommand(); // Do not overwrite a previous result if ($event->getResult()) { return null; } $operation = $this->description->getOperation($command->getName()); $responseClass = $operation->getResponseModel(); if ($responseClass === null) { throw new Exception\RuntimeException(sprintf('No response class configured for operation "%s"', $command->getName())); } if (!class_exists($responseClass)) { throw new Exception\RuntimeException(sprintf('Response class "%s" of operation "%s" does not exist', $responseClass, $command->getName())); } /** @todo We could check if the response class implements ResponseInterface */ /** @var ResponseInterface $responseClass */ return $responseClass::fromHttpResponse($event->getResponse()); }
/** * @param Operation $operation * @param ProcessEvent $event * @return ResponseInterface */ public static function fromOperation(Operation $operation, ProcessEvent $event) { return new static($event->getResponse()); }
/** * @param ProcessEvent $event Process event of the attempt. * @param array $acceptor Acceptor configuration being checked. * * @return bool */ private function matchesStatus(ProcessEvent $event, array $acceptor) { if (!$event->getResponse()) { return false; } return $acceptor['expected'] == $event->getResponse()->getStatusCode(); }