daec6f52ea740fe3312af92b63947bd9738168eb
[yaffs-website] / vendor / guzzlehttp / psr7 / src / StreamDecoratorTrait.php
1 <?php
2 namespace GuzzleHttp\Psr7;
3
4 use Psr\Http\Message\StreamInterface;
5
6 /**
7  * Stream decorator trait
8  * @property StreamInterface stream
9  */
10 trait 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 }