source: vendor/guzzlehttp/psr7/src/StreamWrapper.php@ e3d4e0a

Last change on this file since e3d4e0a was e3d4e0a, checked in by Vlado 222039 <vlado.popovski@…>, 7 days ago

Upload project files

  • Property mode set to 100644
File size: 4.5 KB
RevLine 
[e3d4e0a]1<?php
2
3declare(strict_types=1);
4
5namespace GuzzleHttp\Psr7;
6
7use Psr\Http\Message\StreamInterface;
8
9/**
10 * Converts Guzzle streams into PHP stream resources.
11 *
12 * @see https://www.php.net/streamwrapper
13 */
14final class StreamWrapper
15{
16 /** @var resource */
17 public $context;
18
19 /** @var StreamInterface */
20 private $stream;
21
22 /** @var string r, r+, or w */
23 private $mode;
24
25 /**
26 * Returns a resource representing the stream.
27 *
28 * @param StreamInterface $stream The stream to get a resource for
29 *
30 * @return resource
31 *
32 * @throws \InvalidArgumentException if stream is not readable or writable
33 */
34 public static function getResource(StreamInterface $stream)
35 {
36 self::register();
37
38 if ($stream->isReadable()) {
39 $mode = $stream->isWritable() ? 'r+' : 'r';
40 } elseif ($stream->isWritable()) {
41 $mode = 'w';
42 } else {
43 throw new \InvalidArgumentException('The stream must be readable, '
44 .'writable, or both.');
45 }
46
47 return fopen('guzzle://stream', $mode, false, self::createStreamContext($stream));
48 }
49
50 /**
51 * Creates a stream context that can be used to open a stream as a php stream resource.
52 *
53 * @return resource
54 */
55 public static function createStreamContext(StreamInterface $stream)
56 {
57 return stream_context_create([
58 'guzzle' => ['stream' => $stream],
59 ]);
60 }
61
62 /**
63 * Registers the stream wrapper if needed
64 */
65 public static function register(): void
66 {
67 if (!in_array('guzzle', stream_get_wrappers())) {
68 stream_wrapper_register('guzzle', __CLASS__);
69 }
70 }
71
72 public function stream_open(string $path, string $mode, int $options, ?string &$opened_path = null): bool
73 {
74 $options = stream_context_get_options($this->context);
75
76 if (!isset($options['guzzle']['stream'])) {
77 return false;
78 }
79
80 $this->mode = $mode;
81 $this->stream = $options['guzzle']['stream'];
82
83 return true;
84 }
85
86 public function stream_read(int $count): string
87 {
88 return $this->stream->read($count);
89 }
90
91 public function stream_write(string $data): int
92 {
93 return $this->stream->write($data);
94 }
95
96 public function stream_tell(): int
97 {
98 return $this->stream->tell();
99 }
100
101 public function stream_eof(): bool
102 {
103 return $this->stream->eof();
104 }
105
106 public function stream_seek(int $offset, int $whence): bool
107 {
108 $this->stream->seek($offset, $whence);
109
110 return true;
111 }
112
113 /**
114 * @return resource|false
115 */
116 public function stream_cast(int $cast_as)
117 {
118 $stream = clone $this->stream;
119 $resource = $stream->detach();
120
121 return $resource ?? false;
122 }
123
124 /**
125 * @return array{
126 * dev: int,
127 * ino: int,
128 * mode: int,
129 * nlink: int,
130 * uid: int,
131 * gid: int,
132 * rdev: int,
133 * size: int,
134 * atime: int,
135 * mtime: int,
136 * ctime: int,
137 * blksize: int,
138 * blocks: int
139 * }|false
140 */
141 public function stream_stat()
142 {
143 if ($this->stream->getSize() === null) {
144 return false;
145 }
146
147 static $modeMap = [
148 'r' => 33060,
149 'rb' => 33060,
150 'r+' => 33206,
151 'w' => 33188,
152 'wb' => 33188,
153 ];
154
155 return [
156 'dev' => 0,
157 'ino' => 0,
158 'mode' => $modeMap[$this->mode],
159 'nlink' => 0,
160 'uid' => 0,
161 'gid' => 0,
162 'rdev' => 0,
163 'size' => $this->stream->getSize() ?: 0,
164 'atime' => 0,
165 'mtime' => 0,
166 'ctime' => 0,
167 'blksize' => 0,
168 'blocks' => 0,
169 ];
170 }
171
172 /**
173 * @return array{
174 * dev: int,
175 * ino: int,
176 * mode: int,
177 * nlink: int,
178 * uid: int,
179 * gid: int,
180 * rdev: int,
181 * size: int,
182 * atime: int,
183 * mtime: int,
184 * ctime: int,
185 * blksize: int,
186 * blocks: int
187 * }
188 */
189 public function url_stat(string $path, int $flags): array
190 {
191 return [
192 'dev' => 0,
193 'ino' => 0,
194 'mode' => 0,
195 'nlink' => 0,
196 'uid' => 0,
197 'gid' => 0,
198 'rdev' => 0,
199 'size' => 0,
200 'atime' => 0,
201 'mtime' => 0,
202 'ctime' => 0,
203 'blksize' => 0,
204 'blocks' => 0,
205 ];
206 }
207}
Note: See TracBrowser for help on using the repository browser.