Viewing file: ReadLimitEntityBody.php (2.87 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace Guzzle\Http;
/** * EntityBody decorator used to return only a subset of an entity body */ class ReadLimitEntityBody extends AbstractEntityBodyDecorator { /** @var int Limit the number of bytes that can be read */ protected $limit;
/** @var int Offset to start reading from */ protected $offset;
/** * @param EntityBodyInterface $body Body to wrap * @param int $limit Total number of bytes to allow to be read from the stream * @param int $offset Position to seek to before reading (only works on seekable streams) */ public function __construct(EntityBodyInterface $body, $limit, $offset = 0) { parent::__construct($body); $this->setLimit($limit)->setOffset($offset); }
/** * Returns only a subset of the decorated entity body when cast as a string * {@inheritdoc} */ public function __toString() { return substr((string) $this->body, $this->offset, $this->limit) ?: ''; }
public function isConsumed() { return (($this->offset + $this->limit) - $this->body->ftell()) <= 0; }
/** * Returns the Content-Length of the limited subset of data * {@inheritdoc} */ public function getContentLength() { $length = $this->body->getContentLength();
return $length === false ? $this->limit : min($this->limit, min($length, $this->offset + $this->limit) - $this->offset); }
/** * Allow for a bounded seek on the read limited entity body * {@inheritdoc} */ public function seek($offset, $whence = SEEK_SET) { return $whence === SEEK_SET ? $this->body->seek(max($this->offset, min($this->offset + $this->limit, $offset))) : false; }
/** * Set the offset to start limiting from * * @param int $offset Offset to seek to and begin byte limiting from * * @return self */ public function setOffset($offset) { $this->body->seek($offset); $this->offset = $offset;
return $this; }
/** * Set the limit of bytes that the decorator allows to be read from the stream * * @param int $limit Total number of bytes to allow to be read from the stream * * @return self */ public function setLimit($limit) { $this->limit = $limit;
return $this; }
public function read($length) { // Check if the current position is less than the total allowed bytes + original offset $remaining = ($this->offset + $this->limit) - $this->body->ftell(); if ($remaining > 0) { // Only return the amount of requested data, ensuring that the byte limit is not exceeded return $this->body->read(min($remaining, $length)); } else { return false; } } }
|