123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- <?php
- namespace Aws\Api\Parser;
- use GuzzleHttp\Psr7;
- use Psr\Http\Message\StreamInterface;
- use Aws\Api\Parser\Exception\ParserException;
- /**
- * @inheritDoc
- */
- class NonSeekableStreamDecodingEventStreamIterator extends DecodingEventStreamIterator
- {
- /** @var array $tempBuffer */
- private $tempBuffer;
- /**
- * NonSeekableStreamDecodingEventStreamIterator constructor.
- *
- * @param StreamInterface $stream
- */
- public function __construct(StreamInterface $stream)
- {
- $this->stream = $stream;
- if ($this->stream->isSeekable()) {
- throw new \InvalidArgumentException('The stream provided must be not seekable.');
- }
- $this->tempBuffer = [];
- }
- /**
- * @inheritDoc
- *
- * @return array
- */
- protected function parseEvent(): array
- {
- $event = [];
- $this->hashContext = hash_init('crc32b');
- $prelude = $this->parsePrelude()[0];
- list(
- $event[self::HEADERS],
- $numBytes
- ) = $this->parseHeaders($prelude[self::LENGTH_HEADERS]);
- $event[self::PAYLOAD] = Psr7\Utils::streamFor(
- $this->readAndHashBytes(
- $prelude[self::LENGTH_TOTAL] - self::BYTES_PRELUDE
- - $numBytes - self::BYTES_TRAILING
- )
- );
- $calculatedCrc = hash_final($this->hashContext, true);
- $messageCrc = $this->stream->read(4);
- if ($calculatedCrc !== $messageCrc) {
- throw new ParserException('Message checksum mismatch.');
- }
- return $event;
- }
- protected function readAndHashBytes($num): string
- {
- $bytes = '';
- while (!empty($this->tempBuffer) && $num > 0) {
- $byte = array_shift($this->tempBuffer);
- $bytes .= $byte;
- $num = $num - 1;
- }
- $bytes = $bytes . $this->stream->read($num);
- hash_update($this->hashContext, $bytes);
- return $bytes;
- }
- // Iterator Functionality
- #[\ReturnTypeWillChange]
- public function rewind()
- {
- $this->currentEvent = $this->parseEvent();
- }
- public function next()
- {
- $this->tempBuffer[] = $this->stream->read(1);
- if ($this->valid()) {
- $this->key++;
- $this->currentEvent = $this->parseEvent();
- }
- }
- /**
- * @return bool
- */
- #[\ReturnTypeWillChange]
- public function valid()
- {
- return !$this->stream->eof();
- }
- }
|