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