krz/vox-populi

A Tumblr web client.

clone: git clone https://gitbay.org/krz/vox-populi.git

main: vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php · raw

  1<?php
  2namespace GuzzleHttp\Psr7;
  3
  4use Psr\Http\Message\StreamInterface;
  5
  6/**
  7 * Stream decorator trait
  8 * @property StreamInterface stream
  9 */
 10trait StreamDecoratorTrait
 11{
 12    /**
 13     * @param StreamInterface $stream Stream to decorate
 14     */
 15    public function __construct(StreamInterface $stream)
 16    {
 17        $this->stream = $stream;
 18    }
 19
 20    /**
 21     * Magic method used to create a new stream if streams are not added in
 22     * the constructor of a decorator (e.g., LazyOpenStream).
 23     *
 24     * @param string $name Name of the property (allows "stream" only).
 25     *
 26     * @return StreamInterface
 27     */
 28    public function __get($name)
 29    {
 30        if ($name == 'stream') {
 31            $this->stream = $this->createStream();
 32            return $this->stream;
 33        }
 34
 35        throw new \UnexpectedValueException("$name not found on class");
 36    }
 37
 38    public function __toString()
 39    {
 40        try {
 41            if ($this->isSeekable()) {
 42                $this->seek(0);
 43            }
 44            return $this->getContents();
 45        } catch (\Exception $e) {
 46            // Really, PHP? https://bugs.php.net/bug.php?id=53648
 47            trigger_error('StreamDecorator::__toString exception: '
 48                . (string) $e, E_USER_ERROR);
 49            return '';
 50        }
 51    }
 52
 53    public function getContents()
 54    {
 55        return copy_to_string($this);
 56    }
 57
 58    /**
 59     * Allow decorators to implement custom methods
 60     *
 61     * @param string $method Missing method name
 62     * @param array  $args   Method arguments
 63     *
 64     * @return mixed
 65     */
 66    public function __call($method, array $args)
 67    {
 68        $result = call_user_func_array([$this->stream, $method], $args);
 69
 70        // Always return the wrapped object if the result is a return $this
 71        return $result === $this->stream ? $this : $result;
 72    }
 73
 74    public function close()
 75    {
 76        $this->stream->close();
 77    }
 78
 79    public function getMetadata($key = null)
 80    {
 81        return $this->stream->getMetadata($key);
 82    }
 83
 84    public function detach()
 85    {
 86        return $this->stream->detach();
 87    }
 88
 89    public function getSize()
 90    {
 91        return $this->stream->getSize();
 92    }
 93
 94    public function eof()
 95    {
 96        return $this->stream->eof();
 97    }
 98
 99    public function tell()
100    {
101        return $this->stream->tell();
102    }
103
104    public function isReadable()
105    {
106        return $this->stream->isReadable();
107    }
108
109    public function isWritable()
110    {
111        return $this->stream->isWritable();
112    }
113
114    public function isSeekable()
115    {
116        return $this->stream->isSeekable();
117    }
118
119    public function rewind()
120    {
121        $this->seek(0);
122    }
123
124    public function seek($offset, $whence = SEEK_SET)
125    {
126        $this->stream->seek($offset, $whence);
127    }
128
129    public function read($length)
130    {
131        return $this->stream->read($length);
132    }
133
134    public function write($string)
135    {
136        return $this->stream->write($string);
137    }
138
139    /**
140     * Implement in subclasses to dynamically create streams when requested.
141     *
142     * @return StreamInterface
143     * @throws \BadMethodCallException
144     */
145    protected function createStream()
146    {
147        throw new \BadMethodCallException('Not implemented');
148    }
149}