/**
  * @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 addObjectUrl(ProcessEvent $e)
 {
     if ($e->getException()) {
         return;
     }
     $name = $e->getCommand()->getName();
     if ($name === 'PutObject' || $name === 'CopyObject') {
         $e->getResult()['ObjectURL'] = $e->getRequest()->getUrl();
     } elseif ($name === 'CompleteMultipartUpload') {
         $e->getResult()['ObjectURL'] = $e->getResult()['Location'];
     }
 }
 public function onProcess(ProcessEvent $event)
 {
     if ($event->getCommand()->getName() !== 'ReceiveMessage') {
         return;
     }
     $result = $event->getResult();
     if (isset($result['Messages'])) {
         foreach ($result['Messages'] as $message) {
             if ($message['MD5OfBody'] != md5($message['Body'])) {
                 throw new SqsException('Body MD5 mismatch for ' . var_export($message, true), $event->getTransaction());
             }
         }
     }
 }
 public function onProcess(ProcessEvent $event)
 {
     // Only add a result object if no exception was encountered.
     if ($event->getException()) {
         return;
     }
     $command = $event->getCommand();
     $operation = $this->description->getOperation($command->getName());
     $rawConfig = $operation->toArray();
     if (empty($rawConfig['responseParser'])) {
         return;
     }
     $parsedResponse = $this->parseResponse($event, $rawConfig['responseParser']);
     $event->setResult($parsedResponse);
 }
 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;
 }
 /**
  * @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::fromOperation($operation, $event);
 }
 /**
  * Stops propagation of ProcessEvents when using Batching
  *
  * @param  ProcessEvent $event The Process Event
  *
  * @return bool
  */
 public function onProcess(ProcessEvent $event)
 {
     $command = $event->getCommand();
     $operation = $this->description->getOperation($command->getName());
     if (!$operation->getData('batching')) {
         return false;
     }
     $event->stopPropagation();
     return true;
 }