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