diff options
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/Api/Parser/AbstractRestParser.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/Api/Parser/AbstractRestParser.php | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/AbstractRestParser.php b/vendor/aws/aws-sdk-php/src/Api/Parser/AbstractRestParser.php new file mode 100644 index 0000000..c977588 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/AbstractRestParser.php @@ -0,0 +1,184 @@ +<?php +namespace Aws\Api\Parser; + +use Aws\Api\DateTimeResult; +use Aws\Api\Shape; +use Aws\Api\StructureShape; +use Aws\Result; +use Aws\CommandInterface; +use Psr\Http\Message\ResponseInterface; + +/** + * @internal + */ +abstract class AbstractRestParser extends AbstractParser +{ + use PayloadParserTrait; + + /** + * Parses a payload from a response. + * + * @param ResponseInterface $response Response to parse. + * @param StructureShape $member Member to parse + * @param array $result Result value + * + * @return mixed + */ + abstract protected function payload( + ResponseInterface $response, + StructureShape $member, + array &$result + ); + + public function __invoke( + CommandInterface $command, + ResponseInterface $response + ) { + $output = $this->api->getOperation($command->getName())->getOutput(); + $result = []; + + if ($payload = $output['payload']) { + $this->extractPayload($payload, $output, $response, $result); + } + + foreach ($output->getMembers() as $name => $member) { + switch ($member['location']) { + case 'header': + $this->extractHeader($name, $member, $response, $result); + break; + case 'headers': + $this->extractHeaders($name, $member, $response, $result); + break; + case 'statusCode': + $this->extractStatus($name, $response, $result); + break; + } + } + + if (!$payload + && $response->getBody()->getSize() > 0 + && count($output->getMembers()) > 0 + ) { + // if no payload was found, then parse the contents of the body + $this->payload($response, $output, $result); + } + + return new Result($result); + } + + private function extractPayload( + $payload, + StructureShape $output, + ResponseInterface $response, + array &$result + ) { + $member = $output->getMember($payload); + + if (!empty($member['eventstream'])) { + $result[$payload] = new EventParsingIterator( + $response->getBody(), + $member, + $this + ); + } else if ($member instanceof StructureShape) { + // Structure members parse top-level data into a specific key. + $result[$payload] = []; + $this->payload($response, $member, $result[$payload]); + } else { + // Streaming data is just the stream from the response body. + $result[$payload] = $response->getBody(); + } + } + + /** + * Extract a single header from the response into the result. + */ + private function extractHeader( + $name, + Shape $shape, + ResponseInterface $response, + &$result + ) { + $value = $response->getHeaderLine($shape['locationName'] ?: $name); + + switch ($shape->getType()) { + case 'float': + case 'double': + $value = (float) $value; + break; + case 'long': + $value = (int) $value; + break; + case 'boolean': + $value = filter_var($value, FILTER_VALIDATE_BOOLEAN); + break; + case 'blob': + $value = base64_decode($value); + break; + case 'timestamp': + try { + $value = DateTimeResult::fromTimestamp( + $value, + !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null + ); + break; + } catch (\Exception $e) { + // If the value cannot be parsed, then do not add it to the + // output structure. + return; + } + case 'string': + try { + if ($shape['jsonvalue']) { + $value = $this->parseJson(base64_decode($value), $response); + } + + // If value is not set, do not add to output structure. + if (!isset($value)) { + return; + } + break; + } catch (\Exception $e) { + //If the value cannot be parsed, then do not add it to the + //output structure. + return; + } + } + + $result[$name] = $value; + } + + /** + * Extract a map of headers with an optional prefix from the response. + */ + private function extractHeaders( + $name, + Shape $shape, + ResponseInterface $response, + &$result + ) { + // Check if the headers are prefixed by a location name + $result[$name] = []; + $prefix = $shape['locationName']; + $prefixLen = $prefix !== null ? strlen($prefix) : 0; + + foreach ($response->getHeaders() as $k => $values) { + if (!$prefixLen) { + $result[$name][$k] = implode(', ', $values); + } elseif (stripos($k, $prefix) === 0) { + $result[$name][substr($k, $prefixLen)] = implode(', ', $values); + } + } + } + + /** + * Places the status code of the response into the result array. + */ + private function extractStatus( + $name, + ResponseInterface $response, + array &$result + ) { + $result[$name] = (int) $response->getStatusCode(); + } +} |