Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace GuzzleHttp\Psr7;
6
 
7
use Psr\Http\Message\StreamInterface;
8
 
9
/**
10
 * Converts Guzzle streams into PHP stream resources.
11
 *
12
 * @see https://www.php.net/streamwrapper
13
 */
14
final 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, '
1441 ariadna 44
                .'writable, or both.');
1 efrain 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([
1441 ariadna 58
            'guzzle' => ['stream' => $stream],
1 efrain 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
 
1441 ariadna 72
    public function stream_open(string $path, string $mode, int $options, ?string &$opened_path = null): bool
1 efrain 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
    {
1441 ariadna 118
        $stream = clone $this->stream;
1 efrain 119
        $resource = $stream->detach();
120
 
121
        return $resource ?? false;
122
    }
123
 
124
    /**
1441 ariadna 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
1 efrain 140
     */
1441 ariadna 141
    public function stream_stat()
1 efrain 142
    {
1441 ariadna 143
        if ($this->stream->getSize() === null) {
144
            return false;
145
        }
146
 
1 efrain 147
        static $modeMap = [
1441 ariadna 148
            'r' => 33060,
1 efrain 149
            'rb' => 33060,
150
            'r+' => 33206,
1441 ariadna 151
            'w' => 33188,
152
            'wb' => 33188,
1 efrain 153
        ];
154
 
155
        return [
1441 ariadna 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,
1 efrain 167
            'blksize' => 0,
1441 ariadna 168
            'blocks' => 0,
1 efrain 169
        ];
170
    }
171
 
172
    /**
1441 ariadna 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
     * }
1 efrain 188
     */
189
    public function url_stat(string $path, int $flags): array
190
    {
191
        return [
1441 ariadna 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,
1 efrain 203
            'blksize' => 0,
1441 ariadna 204
            'blocks' => 0,
1 efrain 205
        ];
206
    }
207
}