annotate vendor/guzzlehttp/psr7/src/StreamWrapper.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
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 }