| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | <?phpnamespace 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);    }}
 |