1<?php 2 3declare(strict_types=1); 4 5namespace GuzzleHttp\Psr7; 6 7use Psr\Http\Message\StreamInterface; 8 9/** 10 * Stream decorator that begins dropping data once the size of the underlying 11 * stream becomes too full. 12 */ 13final class DroppingStream implements StreamInterface 14{ 15 use StreamDecoratorTrait; 16 17 /** @var int */ 18 private $maxLength; 19 20 /** @var StreamInterface */ 21 private $stream; 22 23 /** 24 * @param StreamInterface $stream Underlying stream to decorate. 25 * @param int $maxLength Maximum size before dropping data. 26 */ 27 public function __construct(StreamInterface $stream, int $maxLength) 28 { 29 $this->stream = $stream; 30 $this->maxLength = $maxLength; 31 } 32 33 public function write($string): int 34 { 35 $diff = $this->maxLength - $this->stream->getSize(); 36 37 // Begin returning 0 when the underlying stream is too large. 38 if ($diff <= 0) { 39 return 0; 40 } 41 42 // Write the stream or a subset of the stream if needed. 43 if (strlen($string) < $diff) { 44 return $this->stream->write($string); 45 } 46 47 return $this->stream->write(substr($string, 0, $diff)); 48 } 49} 50