You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.2 KiB
49 lines
1.2 KiB
<?php |
|
|
|
declare(strict_types=1); |
|
|
|
namespace GuzzleHttp\Psr7; |
|
|
|
use Psr\Http\Message\StreamInterface; |
|
|
|
/** |
|
* Stream decorator that begins dropping data once the size of the underlying |
|
* stream becomes too full. |
|
*/ |
|
final class DroppingStream implements StreamInterface |
|
{ |
|
use StreamDecoratorTrait; |
|
|
|
/** @var int */ |
|
private $maxLength; |
|
|
|
/** @var StreamInterface */ |
|
private $stream; |
|
|
|
/** |
|
* @param StreamInterface $stream Underlying stream to decorate. |
|
* @param int $maxLength Maximum size before dropping data. |
|
*/ |
|
public function __construct(StreamInterface $stream, int $maxLength) |
|
{ |
|
$this->stream = $stream; |
|
$this->maxLength = $maxLength; |
|
} |
|
|
|
public function write($string): int |
|
{ |
|
$diff = $this->maxLength - $this->stream->getSize(); |
|
|
|
// Begin returning 0 when the underlying stream is too large. |
|
if ($diff <= 0) { |
|
return 0; |
|
} |
|
|
|
// Write the stream or a subset of the stream if needed. |
|
if (strlen($string) < $diff) { |
|
return $this->stream->write($string); |
|
} |
|
|
|
return $this->stream->write(substr($string, 0, $diff)); |
|
} |
|
}
|
|
|