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