<?php namespace GuzzleHttp\Psr7; use Psr\Http\Message\StreamInterface; /** * Decorator used to return only a subset of a stream */ class LimitStream implements StreamInterface { use StreamDecoratorTrait; /** @var int Offset to start reading from */ private $offset; /** @var int Limit the number of bytes that can be read */ private $limit; /** * @param StreamInterface $stream Stream to wrap * @param int $limit Total number of bytes to allow to be read * from the stream. Pass -1 for no limit. * @param int $offset Position to seek to before reading (only * works on seekable streams). */ public function __construct( StreamInterface $stream, $limit = -1, $offset = 0 ) { $this->stream = $stream; $this->setLimit($limit); $this->setOffset($offset); } public function eof() { // Always return true if the underlying stream is EOF if ($this->stream->eof()) { return true; } // No limit and the underlying stream is not at EOF if ($this->limit == -1) { return false; } return $this->stream->tell() >= $this->offset + $this->limit; } /** * Returns the size of the limited subset of data * {@inheritdoc} */ public function getSize() { if (null === ($length = $this->stream->getSize())) { return null; } elseif ($this->limit == -1) { return $length - $this->offset; } else { return min($this->limit, $length - $this->offset); } } /** * Allow for a bounded seek on the read limited stream * {@inheritdoc} */ public function seek($offset, $whence = SEEK_SET) { if ($whence !== SEEK_SET || $offset < 0) { throw new \RuntimeException(sprintf( 'Cannot seek to offset % with whence %s', $offset, $whence )); } $offset += $this->offset; if ($this->limit !== -1) { if ($offset > $this->offset + $this->limit) { $offset = $this->offset + $this->limit; } } $this->stream->seek($offset); } /** * Give a relative tell() * {@inheritdoc} */ public function tell() { return $this->stream->tell() - $this->offset; } /** * Set the offset to start limiting from * * @param int $offset Offset to seek to and begin byte limiting from * * @throws \RuntimeException if the stream cannot be seeked. */ public function setOffset($offset) { $current = $this->stream->tell(); if ($current !== $offset) { // If the stream cannot seek to the offset position, then read to it if ($this->stream->isSeekable()) { $this->stream->seek($offset); } elseif ($current > $offset) { throw new \RuntimeException("Could not seek to stream offset $offset"); } else { $this->stream->read($offset - $current); } } $this->offset = $offset; } /** * Set the limit of bytes that the decorator allows to be read from the * stream. * * @param int $limit Number of bytes to allow to be read from the stream. * Use -1 for no limit. */ public function setLimit($limit) { $this->limit = $limit; } public function read($length) { if ($this->limit == -1) { return $this->stream->read($length); } // Check if the current position is less than the total allowed // bytes + original offset $remaining = ($this->offset + $this->limit) - $this->stream->tell(); if ($remaining > 0) { // Only return the amount of requested data, ensuring that the byte // limit is not exceeded return $this->stream->read(min($remaining, $length)); } return ''; } }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
AppendStream.php | File | 5.59 KB | 0644 |
|
BufferStream.php | File | 2.97 KB | 0644 |
|
CachingStream.php | File | 4.15 KB | 0644 |
|
DroppingStream.php | File | 1.05 KB | 0644 |
|
FnStream.php | File | 3.84 KB | 0644 |
|
InflateStream.php | File | 1.78 KB | 0644 |
|
LazyOpenStream.php | File | 880 B | 0644 |
|
LimitStream.php | File | 4.11 KB | 0644 |
|
MessageTrait.php | File | 4.47 KB | 0644 |
|
MultipartStream.php | File | 4.58 KB | 0644 |
|
NoSeekStream.php | File | 424 B | 0644 |
|
PumpStream.php | File | 3.94 KB | 0644 |
|
Request.php | File | 3.35 KB | 0644 |
|
Response.php | File | 4.13 KB | 0644 |
|
Rfc7230.php | File | 684 B | 0644 |
|
ServerRequest.php | File | 9.57 KB | 0644 |
|
Stream.php | File | 7.04 KB | 0644 |
|
StreamDecoratorTrait.php | File | 3.2 KB | 0644 |
|
StreamWrapper.php | File | 3.67 KB | 0644 |
|
UploadedFile.php | File | 7.37 KB | 0644 |
|
Uri.php | File | 20.3 KB | 0644 |
|
UriNormalizer.php | File | 8.12 KB | 0644 |
|
UriResolver.php | File | 8.57 KB | 0644 |
|
functions.php | File | 26.03 KB | 0644 |
|
functions_include.php | File | 156 B | 0644 |
|