AbstractErrorParser.php 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <?php
  2. namespace Aws\Api\ErrorParser;
  3. use Aws\Api\Parser\MetadataParserTrait;
  4. use Aws\Api\Parser\PayloadParserTrait;
  5. use Aws\Api\Service;
  6. use Aws\Api\StructureShape;
  7. use Aws\CommandInterface;
  8. use Psr\Http\Message\ResponseInterface;
  9. abstract class AbstractErrorParser
  10. {
  11. use MetadataParserTrait;
  12. use PayloadParserTrait;
  13. /**
  14. * @var Service
  15. */
  16. protected $api;
  17. /**
  18. * @param Service $api
  19. */
  20. public function __construct(Service $api = null)
  21. {
  22. $this->api = $api;
  23. }
  24. abstract protected function payload(
  25. ResponseInterface $response,
  26. StructureShape $member
  27. );
  28. protected function extractPayload(
  29. StructureShape $member,
  30. ResponseInterface $response
  31. ) {
  32. if ($member instanceof StructureShape) {
  33. // Structure members parse top-level data into a specific key.
  34. return $this->payload($response, $member);
  35. } else {
  36. // Streaming data is just the stream from the response body.
  37. return $response->getBody();
  38. }
  39. }
  40. protected function populateShape(
  41. array &$data,
  42. ResponseInterface $response,
  43. CommandInterface $command = null
  44. ) {
  45. $data['body'] = [];
  46. if (!empty($command) && !empty($this->api)) {
  47. // If modeled error code is indicated, check for known error shape
  48. if (!empty($data['code'])) {
  49. $errors = $this->api->getOperation($command->getName())->getErrors();
  50. foreach ($errors as $key => $error) {
  51. // If error code matches a known error shape, populate the body
  52. if ($data['code'] == $error['name']
  53. && $error instanceof StructureShape
  54. ) {
  55. $modeledError = $error;
  56. $data['body'] = $this->extractPayload(
  57. $modeledError,
  58. $response
  59. );
  60. $data['error_shape'] = $modeledError;
  61. foreach ($error->getMembers() as $name => $member) {
  62. switch ($member['location']) {
  63. case 'header':
  64. $this->extractHeader($name, $member, $response, $data['body']);
  65. break;
  66. case 'headers':
  67. $this->extractHeaders($name, $member, $response, $data['body']);
  68. break;
  69. case 'statusCode':
  70. $this->extractStatus($name, $response, $data['body']);
  71. break;
  72. }
  73. }
  74. break;
  75. }
  76. }
  77. }
  78. }
  79. return $data;
  80. }
  81. }