Completed
Pull Request — master (#18)
by SignpostMarv
02:54
created

UrlUtils::resolveRelativeUrlToAbsoluteUrl()   B

Complexity

Conditions 5
Paths 8

Size

Total Lines 41
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 20
CRAP Score 5.0187

Importance

Changes 0
Metric Value
cc 5
eloc 17
nc 8
nop 3
dl 0
loc 41
ccs 20
cts 22
cp 0.9091
crap 5.0187
rs 8.439
c 0
b 0
f 0
1
<?php
2
namespace GoetasWebservices\XML\XSDReader\Utils;
3
4
class UrlUtils
5
{
6
    /**
7
    * @param string $base
8
    * @param string $rel
9
    *
10
    * @return string
11
    */
12 162
    public static function resolveRelativeUrl($base, $rel)
13
    {
14 162
        if (!$rel) {
15 6
            return $base;
16
        } elseif (
17
        /* return if already absolute URL */
18 159
            parse_url($rel, PHP_URL_SCHEME) !== null ||
19 71
            substr($rel, 0, 2) === '//'
20 53
        ) {
21 135
            return $rel;
22
        } elseif (
23
        /* queries and anchors */
24 27
            in_array(
25 27
                $rel[0],
26
                [
27 27
                    '#',
28
                    '?'
29 9
                ]
30 9
            )
31 9
        ) {
32 6
            return $base.$rel;
33
        }
34
35 27
        return static::resolveRelativeUrlAfterEarlyChecks($base, $rel);
36
    }
37
38
    /**
39
    * @param string $base
40
    * @param string $rel
41
    *
42
    * @return string
43
    */
44 27
    protected static function resolveRelativeUrlAfterEarlyChecks($base, $rel)
45
    {
46
        /* fix url file for Windows */
47 27
        $base = preg_replace('#^file:\/\/([^/])#', 'file:///\1', $base);
48
49
        /*
50
         * parse base URL and convert to local variables:
51
         * $scheme, $host, $path
52
         */
53 27
        $parts = parse_url($base);
54
55 27
        return static::resolveRelativeUrlToAbsoluteUrl(
56 27
            $rel,
57
            (
58 27
                $rel[0] === '/'
59 17
                    ? ''  // destroy path if relative url points to root
60 4
                    : ( // remove non-directory element from path
61 21
                        isset($parts['path'])
62 21
                            ? preg_replace('#/[^/]*$#', '', $parts["path"])
63 25
                            : ''
64
                    )
65 9
            ),
66 18
            $parts
67 9
        );
68
    }
69
70
    /**
71
    * @param string $rel
72
    * @param string $path
73
    *
74
    * @return string
75
    */
76 27
    protected static function resolveRelativeUrlToAbsoluteUrl(
77
        $rel,
78
        $path,
79
        array $parts
80
    ) {
81
        /* Build absolute URL */
82 27
        $abs = '';
83
84 27
        if (isset($parts["host"])) {
85 15
            $abs .= $parts['host'];
86 5
        }
87
88 27
        if (isset($parts["port"])) {
89
            $abs .= ":".$parts["port"];
90
        }
91
92 27
        $abs .= $path."/".$rel;
93
94
        /*
95
        * replace superfluous slashes with a single slash.
96
        * covers:
97
        * //
98
        * /./
99
        * /foo/../
100
        */
101 27
        $n = 1;
102
        do {
103 27
            $abs = preg_replace(
104 27
                '#(?:(?:/\.?/)|(?!\.\.)[^/]+/\.\./)#',
105 27
                '/',
106 27
                $abs,
107 27
                -1,
108 18
                $n
109 9
            );
110 27
        } while ($n > 0);
111
112 27
        if (isset($parts["scheme"])) {
113 18
            $abs = $parts["scheme"].'://'.$abs;
114 6
        }
115
116 27
        return $abs;
117
    }
118
119
}
120