diff options
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/Api/Serializer/JsonBody.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/Api/Serializer/JsonBody.php | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/Api/Serializer/JsonBody.php b/vendor/aws/aws-sdk-php/src/Api/Serializer/JsonBody.php new file mode 100644 index 0000000..0b116e0 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Serializer/JsonBody.php @@ -0,0 +1,108 @@ +<?php +namespace Aws\Api\Serializer; + +use Aws\Api\Service; +use Aws\Api\Shape; +use Aws\Api\TimestampShape; +use Aws\Exception\InvalidJsonException; + +/** + * Formats the JSON body of a JSON-REST or JSON-RPC operation. + * @internal + */ +class JsonBody +{ + private $api; + + public function __construct(Service $api) + { + $this->api = $api; + } + + /** + * Gets the JSON Content-Type header for a service API + * + * @param Service $service + * + * @return string + */ + public static function getContentType(Service $service) + { + if ($service->getMetadata('protocol') === 'rest-json') { + return 'application/json'; + } + + $jsonVersion = $service->getMetadata('jsonVersion'); + if (empty($jsonVersion)) { + throw new \InvalidArgumentException('invalid json'); + } else { + return 'application/x-amz-json-' + . @number_format($service->getMetadata('jsonVersion'), 1); + } + } + + /** + * Builds the JSON body based on an array of arguments. + * + * @param Shape $shape Operation being constructed + * @param array $args Associative array of arguments + * + * @return string + */ + public function build(Shape $shape, array $args) + { + $result = json_encode($this->format($shape, $args)); + return $result == '[]' ? '{}' : $result; + } + + private function format(Shape $shape, $value) + { + switch ($shape['type']) { + case 'structure': + $data = []; + if (isset($shape['document']) && $shape['document']) { + return $value; + } + foreach ($value as $k => $v) { + if ($v !== null && $shape->hasMember($k)) { + $valueShape = $shape->getMember($k); + $data[$valueShape['locationName'] ?: $k] + = $this->format($valueShape, $v); + } + } + if (empty($data)) { + return new \stdClass; + } + return $data; + + case 'list': + $items = $shape->getMember(); + foreach ($value as $k => $v) { + $value[$k] = $this->format($items, $v); + } + return $value; + + case 'map': + if (empty($value)) { + return new \stdClass; + } + $values = $shape->getValue(); + foreach ($value as $k => $v) { + $value[$k] = $this->format($values, $v); + } + return $value; + + case 'blob': + return base64_encode($value); + + case 'timestamp': + $timestampFormat = !empty($shape['timestampFormat']) + ? $shape['timestampFormat'] + : 'unixTimestamp'; + return TimestampShape::format($value, $timestampFormat); + + default: + return $value; + } + } +} |