| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 | 
							- <?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();
 
-     }
 
- }
 
 
  |