File: Stream.php Lines 1 to 22 |
|
1 | <?php |
|
2 | namespace Puyo\Psr7; |
|
3 | |
|
4 | /** |
|
5 | * ストリームを抽象化したもの |
|
6 | * |
|
7 | * PSR-7 の StreamInterface の実装。 |
|
8 | * HTTPに限らず利用できるが、現状はバイナリにしか対応していない。 |
|
9 | */ |
| | class Stream implements \Psr\Http\Message\StreamInterface { |
|
11 | /** @var resource */ |
| | protected $fp; |
|
13 | |
|
14 | /** |
|
15 | * ファイルのパスから生成した場合に内部で開くためのStream |
|
16 | * @var resource |
|
17 | */ |
|
18 | protected $tmpFp; |
|
19 | |
|
20 | /** |
|
21 | * ファイルのフルパスもしくはresourceから生成する |
|
22 | * @param resource|string $fileOrStream |
|
File: Stream.php Lines 52 to 79 |
|
52 | |
|
53 | /** |
|
54 | * {@inheritdoc} |
|
55 | */ |
|
56 | public function close() { |
|
57 | if(!$this->fp) { |
|
58 | return; |
|
59 | } |
|
60 | |
| | $fp = $this->detach(); |
|
62 | fclose($fp); |
|
63 | } |
|
64 | |
|
65 | /** |
|
66 | * @return resource |
|
67 | */ |
|
68 | public function detach() { |
| | $fp = $this->fp; |
|
70 | $this->fp = null; |
|
71 | return $fp; |
|
72 | } |
|
73 | |
|
74 | /** |
|
75 | * streamもしくはファイルのフルパスからstreamを割り当てる |
|
76 | * @param string|resource $fileOrStream |
|
77 | * @param string $mode |
|
78 | */ |
|
79 | public function attach($fileOrStream, $mode='rb') { |
|
File: Stream.php Lines 275 to 297 |
|
275 | if (!array_key_exists($key, $metadata)) { |
|
276 | return null; |
|
277 | } |
|
278 | |
|
279 | return $metadata[$key]; |
|
280 | } |
|
281 | |
|
282 | private function setStream($fileOrStream, $mode='rb') { |
|
283 | $error = null; |
| | $fp = $tmpFp = null; |
|
285 | |
|
286 | if(is_string($fileOrStream)) { |
| | set_error_handler(function ($e) use (&$error) { |
|
288 | $error = $e; |
|
289 | }, E_WARNING); |
|
290 | $tmpFp = fopen($fileOrStream, $mode); |
|
291 | restore_error_handler(); |
|
292 | |
|
293 | if($error !== null) { |
|
294 | throw new \InvalidArgumentException('Invalid stream reference provided'); |
|
295 | } |
|
296 | } else if($this->isAvailableStream($fileOrStream)) { |
|
297 | $fp = $fileOrStream; |
|
File: Stream.php Lines 301 to 320 |
|
301 | if($tmpFp !== null) { |
|
302 | $this->fp = $this->tmpFp = $tmpFp; |
|
303 | } |
|
304 | } |
|
305 | |
|
306 | /** |
|
307 | * @param resource $fp |
|
308 | * @return bool |
|
309 | */ |
| | private function isAvailableStream($fp) { |
|
311 | if(is_resource($fp) && 'stream' === get_resource_type($fp)) { |
|
312 | return true; |
|
313 | } |
|
314 | return false; |
|
315 | } |
|
316 | |
|
317 | private function closeTmpStream() { |
|
318 | if($this->isAvailableStream($this->tmpFp)) { |
|
319 | fclose($this->tmpFp); |
|
320 | } |
|