summaryrefslogtreecommitdiff
path: root/vendor/aws/aws-sdk-php/src/Api/ErrorParser
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2022-11-23 21:14:33 +0300
committerAndrew Dolgov <[email protected]>2022-11-23 21:14:33 +0300
commit0c8af4992cb0f7589dcafaad65ada12753c64594 (patch)
tree18e83d068c3e7dd2499331de977782b382279396 /vendor/aws/aws-sdk-php/src/Api/ErrorParser
initial
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/Api/ErrorParser')
-rw-r--r--vendor/aws/aws-sdk-php/src/Api/ErrorParser/AbstractErrorParser.php95
-rw-r--r--vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonParserTrait.php52
-rw-r--r--vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonRpcErrorParser.php49
-rw-r--r--vendor/aws/aws-sdk-php/src/Api/ErrorParser/RestJsonErrorParser.php58
-rw-r--r--vendor/aws/aws-sdk-php/src/Api/ErrorParser/XmlErrorParser.php111
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]);
+ }
+ }
+}