Subversion Repositories php-qbpwcf

Rev

Details | Last modification | View Log | RSS feed

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