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