class StreamWrapper
Converts Guzzle streams into PHP stream resources.
Hierarchy
- class \GuzzleHttp\Psr7\StreamWrapper
Expanded class hierarchy of StreamWrapper
See also
https://www.php.net/streamwrapper
File
-
vendor/
guzzlehttp/ psr7/ src/ StreamWrapper.php, line 14
Namespace
GuzzleHttp\Psr7View source
final class StreamWrapper {
/** @var resource */
public $context;
/** @var StreamInterface */
private $stream;
/** @var string r, r+, or w */
private $mode;
/**
* Returns a resource representing the stream.
*
* @param StreamInterface $stream The stream to get a resource for
*
* @return resource
*
* @throws \InvalidArgumentException if stream is not readable or writable
*/
public static function getResource(StreamInterface $stream) {
self::register();
if ($stream->isReadable()) {
$mode = $stream->isWritable() ? 'r+' : 'r';
}
elseif ($stream->isWritable()) {
$mode = 'w';
}
else {
throw new \InvalidArgumentException('The stream must be readable, ' . 'writable, or both.');
}
return fopen('guzzle://stream', $mode, false, self::createStreamContext($stream));
}
/**
* Creates a stream context that can be used to open a stream as a php stream resource.
*
* @return resource
*/
public static function createStreamContext(StreamInterface $stream) {
return stream_context_create([
'guzzle' => [
'stream' => $stream,
],
]);
}
/**
* Registers the stream wrapper if needed
*/
public static function register() : void {
if (!in_array('guzzle', stream_get_wrappers())) {
stream_wrapper_register('guzzle', __CLASS__);
}
}
public function stream_open(string $path, string $mode, int $options, ?string &$opened_path = null) : bool {
$options = stream_context_get_options($this->context);
if (!isset($options['guzzle']['stream'])) {
return false;
}
$this->mode = $mode;
$this->stream = $options['guzzle']['stream'];
return true;
}
public function stream_read(int $count) : string {
return $this->stream
->read($count);
}
public function stream_write(string $data) : int {
return $this->stream
->write($data);
}
public function stream_tell() : int {
return $this->stream
->tell();
}
public function stream_eof() : bool {
return $this->stream
->eof();
}
public function stream_seek(int $offset, int $whence) : bool {
$this->stream
->seek($offset, $whence);
return true;
}
/**
* @return resource|false
*/
public function stream_cast(int $cast_as) {
$stream = clone $this->stream;
$resource = $stream->detach();
return $resource ?? false;
}
/**
* @return array{
* dev: int,
* ino: int,
* mode: int,
* nlink: int,
* uid: int,
* gid: int,
* rdev: int,
* size: int,
* atime: int,
* mtime: int,
* ctime: int,
* blksize: int,
* blocks: int
* }|false
*/
public function stream_stat() {
if ($this->stream
->getSize() === null) {
return false;
}
static $modeMap = [
'r' => 33060,
'rb' => 33060,
'r+' => 33206,
'w' => 33188,
'wb' => 33188,
];
return [
'dev' => 0,
'ino' => 0,
'mode' => $modeMap[$this->mode],
'nlink' => 0,
'uid' => 0,
'gid' => 0,
'rdev' => 0,
'size' => $this->stream
->getSize() ?: 0,
'atime' => 0,
'mtime' => 0,
'ctime' => 0,
'blksize' => 0,
'blocks' => 0,
];
}
/**
* @return array{
* dev: int,
* ino: int,
* mode: int,
* nlink: int,
* uid: int,
* gid: int,
* rdev: int,
* size: int,
* atime: int,
* mtime: int,
* ctime: int,
* blksize: int,
* blocks: int
* }
*/
public function url_stat(string $path, int $flags) : array {
return [
'dev' => 0,
'ino' => 0,
'mode' => 0,
'nlink' => 0,
'uid' => 0,
'gid' => 0,
'rdev' => 0,
'size' => 0,
'atime' => 0,
'mtime' => 0,
'ctime' => 0,
'blksize' => 0,
'blocks' => 0,
];
}
}
Members
Title Sort descending | Modifiers | Object type | Summary |
---|---|---|---|
StreamWrapper::$context | public | property | @var resource |
StreamWrapper::$mode | private | property | @var string r, r+, or w |
StreamWrapper::$stream | private | property | @var StreamInterface |
StreamWrapper::createStreamContext | public static | function | Creates a stream context that can be used to open a stream as a php stream resource. |
StreamWrapper::getResource | public static | function | Returns a resource representing the stream. |
StreamWrapper::register | public static | function | Registers the stream wrapper if needed |
StreamWrapper::stream_cast | public | function | |
StreamWrapper::stream_eof | public | function | |
StreamWrapper::stream_open | public | function | |
StreamWrapper::stream_read | public | function | |
StreamWrapper::stream_seek | public | function | |
StreamWrapper::stream_stat | public | function | |
StreamWrapper::stream_tell | public | function | |
StreamWrapper::stream_write | public | function | |
StreamWrapper::url_stat | public | function |