Passed
Push — master ( 503f62...3f0369 )
by Tom
13:13 queued 10:28
created

LibFsStream::fdToPhp()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 4
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
/* this file is part of pipelines */
4
5
namespace Ktomk\Pipelines;
6
7
/**
8
 * Class LibFsStream - stream utility functions
9
 *
10
 * @package Ktomk\Pipelines
11
 */
12
class LibFsStream
13
{
14
    /**
15
     * similar to a readable file, a readable path allows stream-urls
16
     * as well, e.g. php://stdin or php://fd/0 but only for local
17
     * streams.
18
     *
19
     * @param string $path
20
     *
21
     * @return bool
22
     */
23 1
    public static function isReadable($path)
24
    {
25 1
        if (LibFs::isReadableFile($path)) {
26 1
            return true;
27
        }
28
29 1
        if (!stream_is_local($path)) {
30 1
            return false;
31
        }
32
33 1
        return LibFs::canFopen($path, 'rb');
34
    }
35
36
    /**
37
     * @param string $path
38
     *
39
     * @return bool
40
     */
41 2
    public static function isUri($path)
42
    {
43 2
        $scheme = parse_url($path, PHP_URL_SCHEME);
44 2
        if (null === $scheme) {
45 2
            return false;
46
        }
47
48 2
        return in_array($scheme, stream_get_wrappers(), true);
49
    }
50
51
    /**
52
     * map a file path to a stream path (if applicable)
53
     *
54
     * some file paths aren't readable for PHP, e.g. "-" for
55
     * standard in or out or device files from process substitution.
56
     *
57
     * this method maps such paths to php:// stream uris that PHP can
58
     * process better (e.g. file_get_contents() works)
59
     *
60
     * @param string $file
61
     * @param null|string $dashRepresent use NULL to not do any '-' processing
62
     *
63
     * @return string original $file if there was no mapping, php:// URI otherwise
64
     */
65 1
    public static function mapFile($file, $dashRepresent = 'php://stdin')
66
    {
67 1
        if (self::isUri($file)) {
68 1
            return $file;
69
        }
70
71 1
        $path = $file;
72 1
        (null !== $dashRepresent) && ('-' === $file) && $path = $dashRepresent;
73
74 1
        $path = self::fdToPhp($path);
75
76 1
        return stream_is_local($path) ? $path : $file;
77
    }
78
79
    /**
80
     * transform a file-descriptor path (/dev/fd, /proc/self/fd *linux)
81
     * to php://fd for PHP user-land.
82
     *
83
     * @param string $path
84
     *
85
     * @return string
86
     */
87 13
    public static function fdToPhp($path)
88
    {
89
        /* @link https://bugs.php.net/bug.php?id=53465 */
90 13
        return preg_replace('(^/(?>proc/self|dev)/(fd/(?>0|[1-9]\d{0,6})$))D', 'php://\1', $path);
91
    }
92
}
93