| 
<?phpnamespace Aws\Api\Serializer;
 
 use Aws\Api\Service;
 use Aws\CommandInterface;
 use GuzzleHttp\Psr7\Request;
 use Psr\Http\Message\RequestInterface;
 
 /**
 * Prepares a JSON-RPC request for transfer.
 * @internal
 */
 class JsonRpcSerializer
 {
 /** @var JsonBody */
 private $jsonFormatter;
 
 /** @var string */
 private $endpoint;
 
 /** @var Service */
 private $api;
 
 /** @var string */
 private $contentType;
 
 /**
 * @param Service  $api           Service description
 * @param string   $endpoint      Endpoint to connect to
 * @param JsonBody $jsonFormatter Optional JSON formatter to use
 */
 public function __construct(
 Service $api,
 $endpoint,
 JsonBody $jsonFormatter = null
 ) {
 $this->endpoint = $endpoint;
 $this->api = $api;
 $this->jsonFormatter = $jsonFormatter ?: new JsonBody($this->api);
 $this->contentType = JsonBody::getContentType($api);
 }
 
 /**
 * When invoked with an AWS command, returns a serialization array
 * containing "method", "uri", "headers", and "body" key value pairs.
 *
 * @param CommandInterface $command
 *
 * @return RequestInterface
 */
 public function __invoke(CommandInterface $command)
 {
 $name = $command->getName();
 $operation = $this->api->getOperation($name);
 
 return new Request(
 $operation['http']['method'],
 $this->endpoint,
 [
 'X-Amz-Target' => $this->api->getMetadata('targetPrefix') . '.' . $name,
 'Content-Type' => $this->contentType
 ],
 $this->jsonFormatter->build(
 $operation->getInput(),
 $command->toArray()
 )
 );
 }
 }
 
 |