RestJsonErrorParser.php 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <?php
  2. namespace Aws\Api\ErrorParser;
  3. use Aws\Api\Parser\JsonParser;
  4. use Aws\Api\Service;
  5. use Aws\Api\StructureShape;
  6. use Aws\CommandInterface;
  7. use Psr\Http\Message\ResponseInterface;
  8. /**
  9. * Parses JSON-REST errors.
  10. */
  11. class RestJsonErrorParser extends AbstractErrorParser
  12. {
  13. use JsonParserTrait;
  14. private $parser;
  15. public function __construct(Service $api = null, JsonParser $parser = null)
  16. {
  17. parent::__construct($api);
  18. $this->parser = $parser ?: new JsonParser();
  19. }
  20. public function __invoke(
  21. ResponseInterface $response,
  22. CommandInterface $command = null
  23. ) {
  24. $data = $this->genericHandler($response);
  25. // Merge in error data from the JSON body
  26. if ($json = $data['parsed']) {
  27. $data = array_replace($data, $json);
  28. }
  29. // Correct error type from services like Amazon Glacier
  30. if (!empty($data['type'])) {
  31. $data['type'] = strtolower($data['type']);
  32. }
  33. // Retrieve the error code from services like Amazon Elastic Transcoder
  34. if ($code = $response->getHeaderLine('x-amzn-errortype')) {
  35. $colon = strpos($code, ':');
  36. $data['code'] = $colon ? substr($code, 0, $colon) : $code;
  37. }
  38. // Retrieve error message directly
  39. $data['message'] = isset($data['parsed']['message'])
  40. ? $data['parsed']['message']
  41. : (isset($data['parsed']['Message'])
  42. ? $data['parsed']['Message']
  43. : null);
  44. $this->populateShape($data, $response, $command);
  45. return $data;
  46. }
  47. }