diff options
author | Andrew Dolgov <[email protected]> | 2022-11-23 21:14:33 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2022-11-23 21:14:33 +0300 |
commit | 0c8af4992cb0f7589dcafaad65ada12753c64594 (patch) | |
tree | 18e83d068c3e7dd2499331de977782b382279396 /vendor/aws/aws-sdk-php/src/Api/ErrorParser |
initial
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/Api/ErrorParser')
5 files changed, 365 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/Api/ErrorParser/AbstractErrorParser.php b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/AbstractErrorParser.php new file mode 100644 index 0000000..efce3d4 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/AbstractErrorParser.php @@ -0,0 +1,95 @@ +<?php +namespace Aws\Api\ErrorParser; + +use Aws\Api\Parser\MetadataParserTrait; +use Aws\Api\Parser\PayloadParserTrait; +use Aws\Api\Service; +use Aws\Api\StructureShape; +use Aws\CommandInterface; +use Psr\Http\Message\ResponseInterface; + +abstract class AbstractErrorParser +{ + use MetadataParserTrait; + use PayloadParserTrait; + + /** + * @var Service + */ + protected $api; + + /** + * @param Service $api + */ + public function __construct(Service $api = null) + { + $this->api = $api; + } + + abstract protected function payload( + ResponseInterface $response, + StructureShape $member + ); + + protected function extractPayload( + StructureShape $member, + ResponseInterface $response + ) { + if ($member instanceof StructureShape) { + // Structure members parse top-level data into a specific key. + return $this->payload($response, $member); + } else { + // Streaming data is just the stream from the response body. + return $response->getBody(); + } + } + + protected function populateShape( + array &$data, + ResponseInterface $response, + CommandInterface $command = null + ) { + $data['body'] = []; + + if (!empty($command) && !empty($this->api)) { + + // If modeled error code is indicated, check for known error shape + if (!empty($data['code'])) { + + $errors = $this->api->getOperation($command->getName())->getErrors(); + foreach ($errors as $key => $error) { + + // If error code matches a known error shape, populate the body + if ($data['code'] == $error['name'] + && $error instanceof StructureShape + ) { + $modeledError = $error; + $data['body'] = $this->extractPayload( + $modeledError, + $response + ); + $data['error_shape'] = $modeledError; + + foreach ($error->getMembers() as $name => $member) { + switch ($member['location']) { + case 'header': + $this->extractHeader($name, $member, $response, $data['body']); + break; + case 'headers': + $this->extractHeaders($name, $member, $response, $data['body']); + break; + case 'statusCode': + $this->extractStatus($name, $response, $data['body']); + break; + } + } + + break; + } + } + } + } + + return $data; + } +}
\ No newline at end of file diff --git a/vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonParserTrait.php b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonParserTrait.php new file mode 100644 index 0000000..92b447c --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonParserTrait.php @@ -0,0 +1,52 @@ +<?php +namespace Aws\Api\ErrorParser; + +use Aws\Api\Parser\PayloadParserTrait; +use Aws\Api\StructureShape; +use Psr\Http\Message\ResponseInterface; + +/** + * Provides basic JSON error parsing functionality. + */ +trait JsonParserTrait +{ + use PayloadParserTrait; + + private function genericHandler(ResponseInterface $response) + { + $code = (string) $response->getStatusCode(); + if ($this->api + && $this->api->getMetadata('awsQueryCompatible') + && $response->getHeaderLine('x-amzn-query-error') + ) { + $queryError = $response->getHeaderLine('x-amzn-query-error'); + $parts = explode(';', $queryError); + if (isset($parts) && count($parts) == 2 && $parts[0] && $parts[1]) { + $error_code = $parts[0]; + $error_type = $parts[1]; + } + } + if (!isset($error_type)) { + $error_type = $code[0] == '4' ? 'client' : 'server'; + } + + return [ + 'request_id' => (string) $response->getHeaderLine('x-amzn-requestid'), + 'code' => isset($error_code) ? $error_code : null, + 'message' => null, + 'type' => $error_type, + 'parsed' => $this->parseJson($response->getBody(), $response) + ]; + } + + protected function payload( + ResponseInterface $response, + StructureShape $member + ) { + $jsonBody = $this->parseJson($response->getBody(), $response); + + if ($jsonBody) { + return $this->parser->parse($member, $jsonBody); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonRpcErrorParser.php b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonRpcErrorParser.php new file mode 100644 index 0000000..8ac530e --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonRpcErrorParser.php @@ -0,0 +1,49 @@ +<?php +namespace Aws\Api\ErrorParser; + +use Aws\Api\Parser\JsonParser; +use Aws\Api\Service; +use Aws\CommandInterface; +use Psr\Http\Message\ResponseInterface; + +/** + * Parsers JSON-RPC errors. + */ +class JsonRpcErrorParser extends AbstractErrorParser +{ + use JsonParserTrait; + + private $parser; + + public function __construct(Service $api = null, JsonParser $parser = null) + { + parent::__construct($api); + $this->parser = $parser ?: new JsonParser(); + } + + public function __invoke( + ResponseInterface $response, + CommandInterface $command = null + ) { + $data = $this->genericHandler($response); + + // Make the casing consistent across services. + if ($data['parsed']) { + $data['parsed'] = array_change_key_case($data['parsed']); + } + + if (isset($data['parsed']['__type'])) { + if (!isset($data['code'])) { + $parts = explode('#', $data['parsed']['__type']); + $data['code'] = isset($parts[1]) ? $parts[1] : $parts[0]; + } + $data['message'] = isset($data['parsed']['message']) + ? $data['parsed']['message'] + : null; + } + + $this->populateShape($data, $response, $command); + + return $data; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/ErrorParser/RestJsonErrorParser.php b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/RestJsonErrorParser.php new file mode 100644 index 0000000..2f7ba81 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/RestJsonErrorParser.php @@ -0,0 +1,58 @@ +<?php +namespace Aws\Api\ErrorParser; + +use Aws\Api\Parser\JsonParser; +use Aws\Api\Service; +use Aws\Api\StructureShape; +use Aws\CommandInterface; +use Psr\Http\Message\ResponseInterface; + +/** + * Parses JSON-REST errors. + */ +class RestJsonErrorParser extends AbstractErrorParser +{ + use JsonParserTrait; + + private $parser; + + public function __construct(Service $api = null, JsonParser $parser = null) + { + parent::__construct($api); + $this->parser = $parser ?: new JsonParser(); + } + + public function __invoke( + ResponseInterface $response, + CommandInterface $command = null + ) { + $data = $this->genericHandler($response); + + // Merge in error data from the JSON body + if ($json = $data['parsed']) { + $data = array_replace($data, $json); + } + + // Correct error type from services like Amazon Glacier + if (!empty($data['type'])) { + $data['type'] = strtolower($data['type']); + } + + // Retrieve the error code from services like Amazon Elastic Transcoder + if ($code = $response->getHeaderLine('x-amzn-errortype')) { + $colon = strpos($code, ':'); + $data['code'] = $colon ? substr($code, 0, $colon) : $code; + } + + // Retrieve error message directly + $data['message'] = isset($data['parsed']['message']) + ? $data['parsed']['message'] + : (isset($data['parsed']['Message']) + ? $data['parsed']['Message'] + : null); + + $this->populateShape($data, $response, $command); + + return $data; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/ErrorParser/XmlErrorParser.php b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/XmlErrorParser.php new file mode 100644 index 0000000..41f61a4 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/XmlErrorParser.php @@ -0,0 +1,111 @@ +<?php +namespace Aws\Api\ErrorParser; + +use Aws\Api\Parser\PayloadParserTrait; +use Aws\Api\Parser\XmlParser; +use Aws\Api\Service; +use Aws\Api\StructureShape; +use Aws\CommandInterface; +use Psr\Http\Message\ResponseInterface; + +/** + * Parses XML errors. + */ +class XmlErrorParser extends AbstractErrorParser +{ + use PayloadParserTrait; + + protected $parser; + + public function __construct(Service $api = null, XmlParser $parser = null) + { + parent::__construct($api); + $this->parser = $parser ?: new XmlParser(); + } + + public function __invoke( + ResponseInterface $response, + CommandInterface $command = null + ) { + $code = (string) $response->getStatusCode(); + + $data = [ + 'type' => $code[0] == '4' ? 'client' : 'server', + 'request_id' => null, + 'code' => null, + 'message' => null, + 'parsed' => null + ]; + + $body = $response->getBody(); + if ($body->getSize() > 0) { + $this->parseBody($this->parseXml($body, $response), $data); + } else { + $this->parseHeaders($response, $data); + } + + $this->populateShape($data, $response, $command); + + return $data; + } + + private function parseHeaders(ResponseInterface $response, array &$data) + { + if ($response->getStatusCode() == '404') { + $data['code'] = 'NotFound'; + } + + $data['message'] = $response->getStatusCode() . ' ' + . $response->getReasonPhrase(); + + if ($requestId = $response->getHeaderLine('x-amz-request-id')) { + $data['request_id'] = $requestId; + $data['message'] .= " (Request-ID: $requestId)"; + } + } + + private function parseBody(\SimpleXMLElement $body, array &$data) + { + $data['parsed'] = $body; + $prefix = $this->registerNamespacePrefix($body); + + if ($tempXml = $body->xpath("//{$prefix}Code[1]")) { + $data['code'] = (string) $tempXml[0]; + } + + if ($tempXml = $body->xpath("//{$prefix}Message[1]")) { + $data['message'] = (string) $tempXml[0]; + } + + $tempXml = $body->xpath("//{$prefix}RequestId[1]"); + if (isset($tempXml[0])) { + $data['request_id'] = (string)$tempXml[0]; + } + } + + protected function registerNamespacePrefix(\SimpleXMLElement $element) + { + $namespaces = $element->getDocNamespaces(); + if (!isset($namespaces[''])) { + return ''; + } + + // Account for the default namespace being defined and PHP not + // being able to handle it :(. + $element->registerXPathNamespace('ns', $namespaces['']); + return 'ns:'; + } + + protected function payload( + ResponseInterface $response, + StructureShape $member + ) { + $xmlBody = $this->parseXml($response->getBody(), $response); + $prefix = $this->registerNamespacePrefix($xmlBody); + $errorBody = $xmlBody->xpath("//{$prefix}Error"); + + if (is_array($errorBody) && !empty($errorBody[0])) { + return $this->parser->parse($member, $errorBody[0]); + } + } +} |