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@0
|
41 return fopen('guzzle://stream', $mode, null, stream_context_create([
|
Chris@0
|
42 'guzzle' => ['stream' => $stream]
|
Chris@0
|
43 ]));
|
Chris@0
|
44 }
|
Chris@0
|
45
|
Chris@0
|
46 /**
|
Chris@0
|
47 * Registers the stream wrapper if needed
|
Chris@0
|
48 */
|
Chris@0
|
49 public static function register()
|
Chris@0
|
50 {
|
Chris@0
|
51 if (!in_array('guzzle', stream_get_wrappers())) {
|
Chris@0
|
52 stream_wrapper_register('guzzle', __CLASS__);
|
Chris@0
|
53 }
|
Chris@0
|
54 }
|
Chris@0
|
55
|
Chris@0
|
56 public function stream_open($path, $mode, $options, &$opened_path)
|
Chris@0
|
57 {
|
Chris@0
|
58 $options = stream_context_get_options($this->context);
|
Chris@0
|
59
|
Chris@0
|
60 if (!isset($options['guzzle']['stream'])) {
|
Chris@0
|
61 return false;
|
Chris@0
|
62 }
|
Chris@0
|
63
|
Chris@0
|
64 $this->mode = $mode;
|
Chris@0
|
65 $this->stream = $options['guzzle']['stream'];
|
Chris@0
|
66
|
Chris@0
|
67 return true;
|
Chris@0
|
68 }
|
Chris@0
|
69
|
Chris@0
|
70 public function stream_read($count)
|
Chris@0
|
71 {
|
Chris@0
|
72 return $this->stream->read($count);
|
Chris@0
|
73 }
|
Chris@0
|
74
|
Chris@0
|
75 public function stream_write($data)
|
Chris@0
|
76 {
|
Chris@0
|
77 return (int) $this->stream->write($data);
|
Chris@0
|
78 }
|
Chris@0
|
79
|
Chris@0
|
80 public function stream_tell()
|
Chris@0
|
81 {
|
Chris@0
|
82 return $this->stream->tell();
|
Chris@0
|
83 }
|
Chris@0
|
84
|
Chris@0
|
85 public function stream_eof()
|
Chris@0
|
86 {
|
Chris@0
|
87 return $this->stream->eof();
|
Chris@0
|
88 }
|
Chris@0
|
89
|
Chris@0
|
90 public function stream_seek($offset, $whence)
|
Chris@0
|
91 {
|
Chris@0
|
92 $this->stream->seek($offset, $whence);
|
Chris@0
|
93
|
Chris@0
|
94 return true;
|
Chris@0
|
95 }
|
Chris@0
|
96
|
Chris@0
|
97 public function stream_stat()
|
Chris@0
|
98 {
|
Chris@0
|
99 static $modeMap = [
|
Chris@0
|
100 'r' => 33060,
|
Chris@0
|
101 'r+' => 33206,
|
Chris@0
|
102 'w' => 33188
|
Chris@0
|
103 ];
|
Chris@0
|
104
|
Chris@0
|
105 return [
|
Chris@0
|
106 'dev' => 0,
|
Chris@0
|
107 'ino' => 0,
|
Chris@0
|
108 'mode' => $modeMap[$this->mode],
|
Chris@0
|
109 'nlink' => 0,
|
Chris@0
|
110 'uid' => 0,
|
Chris@0
|
111 'gid' => 0,
|
Chris@0
|
112 'rdev' => 0,
|
Chris@0
|
113 'size' => $this->stream->getSize() ?: 0,
|
Chris@0
|
114 'atime' => 0,
|
Chris@0
|
115 'mtime' => 0,
|
Chris@0
|
116 'ctime' => 0,
|
Chris@0
|
117 'blksize' => 0,
|
Chris@0
|
118 'blocks' => 0
|
Chris@0
|
119 ];
|
Chris@0
|
120 }
|
Chris@0
|
121 }
|