| 
<?phpnamespace Aws\Api\Parser;
 
 use Aws\CommandInterface;
 use Aws\Exception\AwsException;
 use Psr\Http\Message\ResponseInterface;
 use GuzzleHttp\Psr7;
 
 /**
 * @internal Decorates a parser and validates the x-amz-crc32 header.
 */
 class Crc32ValidatingParser extends AbstractParser
 {
 /** @var callable */
 private $parser;
 
 /**
 * @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\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);
 }
 }
 
 |