diff options
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/Api/Parser/Crc32ValidatingParser.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/Api/Parser/Crc32ValidatingParser.php | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/Crc32ValidatingParser.php b/vendor/aws/aws-sdk-php/src/Api/Parser/Crc32ValidatingParser.php new file mode 100644 index 0000000..8e5d4f0 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/Crc32ValidatingParser.php @@ -0,0 +1,54 @@ +<?php +namespace Aws\Api\Parser; + +use Aws\Api\StructureShape; +use Aws\CommandInterface; +use Aws\Exception\AwsException; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\StreamInterface; +use GuzzleHttp\Psr7; + +/** + * @internal Decorates a parser and validates the x-amz-crc32 header. + */ +class Crc32ValidatingParser extends AbstractParser +{ + /** + * @param callable $parser Parser to wrap. + */ + public function __construct(callable $parser) + { + $this->parser = $parser; + } + + public function __invoke( + CommandInterface $command, + ResponseInterface $response + ) { + if ($expected = $response->getHeaderLine('x-amz-crc32')) { + $hash = hexdec(Psr7\Utils::hash($response->getBody(), 'crc32b')); + if ($expected != $hash) { + throw new AwsException( + "crc32 mismatch. Expected {$expected}, found {$hash}.", + $command, + [ + 'code' => 'ClientChecksumMismatch', + 'connection_error' => true, + 'response' => $response + ] + ); + } + } + + $fn = $this->parser; + return $fn($command, $response); + } + + public function parseMemberFromStream( + StreamInterface $stream, + StructureShape $member, + $response + ) { + return $this->parser->parseMemberFromStream($stream, $member, $response); + } +} |