AmbiguousSuccessParser.php 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <?php
  2. namespace Aws\S3;
  3. use Aws\Api\Parser\AbstractParser;
  4. use Aws\CommandInterface;
  5. use Aws\Exception\AwsException;
  6. use Psr\Http\Message\ResponseInterface;
  7. /**
  8. * Converts errors returned with a status code of 200 to a retryable error type.
  9. *
  10. * @internal
  11. */
  12. class AmbiguousSuccessParser extends AbstractParser
  13. {
  14. private static $ambiguousSuccesses = [
  15. 'UploadPartCopy' => true,
  16. 'CopyObject' => true,
  17. 'CompleteMultipartUpload' => true,
  18. ];
  19. /** @var callable */
  20. private $parser;
  21. /** @var callable */
  22. private $errorParser;
  23. /** @var string */
  24. private $exceptionClass;
  25. public function __construct(
  26. callable $parser,
  27. callable $errorParser,
  28. $exceptionClass = AwsException::class
  29. ) {
  30. $this->parser = $parser;
  31. $this->errorParser = $errorParser;
  32. $this->exceptionClass = $exceptionClass;
  33. }
  34. public function __invoke(
  35. CommandInterface $command,
  36. ResponseInterface $response
  37. ) {
  38. if (200 === $response->getStatusCode()
  39. && isset(self::$ambiguousSuccesses[$command->getName()])
  40. ) {
  41. $errorParser = $this->errorParser;
  42. $parsed = $errorParser($response);
  43. if (isset($parsed['code']) && isset($parsed['message'])) {
  44. throw new $this->exceptionClass(
  45. $parsed['message'],
  46. $command,
  47. ['connection_error' => true]
  48. );
  49. }
  50. }
  51. $fn = $this->parser;
  52. return $fn($command, $response);
  53. }
  54. }