xref: /plugin/davcal/vendor/sabre/http/tests/HTTP/URLUtilTest.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
1*a1a3b679SAndreas Boehler<?php
2*a1a3b679SAndreas Boehler
3*a1a3b679SAndreas Boehlernamespace Sabre\HTTP;
4*a1a3b679SAndreas Boehler
5*a1a3b679SAndreas Boehlerclass URLUtilTest extends \PHPUnit_Framework_TestCase{
6*a1a3b679SAndreas Boehler
7*a1a3b679SAndreas Boehler    function testEncodePath() {
8*a1a3b679SAndreas Boehler
9*a1a3b679SAndreas Boehler        $str = '';
10*a1a3b679SAndreas Boehler        for ($i = 0;$i < 128;$i++) $str .= chr($i);
11*a1a3b679SAndreas Boehler
12*a1a3b679SAndreas Boehler        $newStr = URLUtil::encodePath($str);
13*a1a3b679SAndreas Boehler
14*a1a3b679SAndreas Boehler        $this->assertEquals(
15*a1a3b679SAndreas Boehler            '%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f' .
16*a1a3b679SAndreas Boehler            '%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f' .
17*a1a3b679SAndreas Boehler            '%20%21%22%23%24%25%26%27()%2a%2b%2c-./' .
18*a1a3b679SAndreas Boehler            '0123456789:%3b%3c%3d%3e%3f' .
19*a1a3b679SAndreas Boehler            '@ABCDEFGHIJKLMNO' .
20*a1a3b679SAndreas Boehler            'PQRSTUVWXYZ%5b%5c%5d%5e_' .
21*a1a3b679SAndreas Boehler            '%60abcdefghijklmno' .
22*a1a3b679SAndreas Boehler            'pqrstuvwxyz%7b%7c%7d~%7f',
23*a1a3b679SAndreas Boehler            $newStr);
24*a1a3b679SAndreas Boehler
25*a1a3b679SAndreas Boehler        $this->assertEquals($str, URLUtil::decodePath($newStr));
26*a1a3b679SAndreas Boehler
27*a1a3b679SAndreas Boehler    }
28*a1a3b679SAndreas Boehler
29*a1a3b679SAndreas Boehler    function testEncodePathSegment() {
30*a1a3b679SAndreas Boehler
31*a1a3b679SAndreas Boehler        $str = '';
32*a1a3b679SAndreas Boehler        for ($i = 0;$i < 128;$i++) $str .= chr($i);
33*a1a3b679SAndreas Boehler
34*a1a3b679SAndreas Boehler        $newStr = URLUtil::encodePathSegment($str);
35*a1a3b679SAndreas Boehler
36*a1a3b679SAndreas Boehler        // Note: almost exactly the same as the last test, with the
37*a1a3b679SAndreas Boehler        // exception of the encoding of / (ascii code 2f)
38*a1a3b679SAndreas Boehler        $this->assertEquals(
39*a1a3b679SAndreas Boehler            '%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f' .
40*a1a3b679SAndreas Boehler            '%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f' .
41*a1a3b679SAndreas Boehler            '%20%21%22%23%24%25%26%27()%2a%2b%2c-.%2f' .
42*a1a3b679SAndreas Boehler            '0123456789:%3b%3c%3d%3e%3f' .
43*a1a3b679SAndreas Boehler            '@ABCDEFGHIJKLMNO' .
44*a1a3b679SAndreas Boehler            'PQRSTUVWXYZ%5b%5c%5d%5e_' .
45*a1a3b679SAndreas Boehler            '%60abcdefghijklmno' .
46*a1a3b679SAndreas Boehler            'pqrstuvwxyz%7b%7c%7d~%7f',
47*a1a3b679SAndreas Boehler            $newStr);
48*a1a3b679SAndreas Boehler
49*a1a3b679SAndreas Boehler        $this->assertEquals($str, URLUtil::decodePathSegment($newStr));
50*a1a3b679SAndreas Boehler
51*a1a3b679SAndreas Boehler    }
52*a1a3b679SAndreas Boehler
53*a1a3b679SAndreas Boehler    function testDecode() {
54*a1a3b679SAndreas Boehler
55*a1a3b679SAndreas Boehler        $str = 'Hello%20Test+Test2.txt';
56*a1a3b679SAndreas Boehler        $newStr = URLUtil::decodePath($str);
57*a1a3b679SAndreas Boehler        $this->assertEquals('Hello Test+Test2.txt', $newStr);
58*a1a3b679SAndreas Boehler
59*a1a3b679SAndreas Boehler    }
60*a1a3b679SAndreas Boehler
61*a1a3b679SAndreas Boehler    /**
62*a1a3b679SAndreas Boehler     * @depends testDecode
63*a1a3b679SAndreas Boehler     */
64*a1a3b679SAndreas Boehler    function testDecodeUmlaut() {
65*a1a3b679SAndreas Boehler
66*a1a3b679SAndreas Boehler        $str = 'Hello%C3%BC.txt';
67*a1a3b679SAndreas Boehler        $newStr = URLUtil::decodePath($str);
68*a1a3b679SAndreas Boehler        $this->assertEquals("Hello\xC3\xBC.txt", $newStr);
69*a1a3b679SAndreas Boehler
70*a1a3b679SAndreas Boehler    }
71*a1a3b679SAndreas Boehler
72*a1a3b679SAndreas Boehler    /**
73*a1a3b679SAndreas Boehler     * @depends testDecodeUmlaut
74*a1a3b679SAndreas Boehler     */
75*a1a3b679SAndreas Boehler    function testDecodeUmlautLatin1() {
76*a1a3b679SAndreas Boehler
77*a1a3b679SAndreas Boehler        $str = 'Hello%FC.txt';
78*a1a3b679SAndreas Boehler        $newStr = URLUtil::decodePath($str);
79*a1a3b679SAndreas Boehler        $this->assertEquals("Hello\xC3\xBC.txt", $newStr);
80*a1a3b679SAndreas Boehler
81*a1a3b679SAndreas Boehler    }
82*a1a3b679SAndreas Boehler
83*a1a3b679SAndreas Boehler    /**
84*a1a3b679SAndreas Boehler     * This testcase was sent by a bug reporter
85*a1a3b679SAndreas Boehler     *
86*a1a3b679SAndreas Boehler     * @depends testDecode
87*a1a3b679SAndreas Boehler     */
88*a1a3b679SAndreas Boehler    function testDecodeAccentsWindows7() {
89*a1a3b679SAndreas Boehler
90*a1a3b679SAndreas Boehler        $str = '/webdav/%C3%A0fo%C3%B3';
91*a1a3b679SAndreas Boehler        $newStr = URLUtil::decodePath($str);
92*a1a3b679SAndreas Boehler        $this->assertEquals(strtolower($str), URLUtil::encodePath($newStr));
93*a1a3b679SAndreas Boehler
94*a1a3b679SAndreas Boehler    }
95*a1a3b679SAndreas Boehler
96*a1a3b679SAndreas Boehler    function testSplitPath() {
97*a1a3b679SAndreas Boehler
98*a1a3b679SAndreas Boehler        $strings = [
99*a1a3b679SAndreas Boehler
100*a1a3b679SAndreas Boehler            // input                    // expected result
101*a1a3b679SAndreas Boehler            '/foo/bar'                 => ['/foo','bar'],
102*a1a3b679SAndreas Boehler            '/foo/bar/'                => ['/foo','bar'],
103*a1a3b679SAndreas Boehler            'foo/bar/'                 => ['foo','bar'],
104*a1a3b679SAndreas Boehler            'foo/bar'                  => ['foo','bar'],
105*a1a3b679SAndreas Boehler            'foo/bar/baz'              => ['foo/bar','baz'],
106*a1a3b679SAndreas Boehler            'foo/bar/baz/'             => ['foo/bar','baz'],
107*a1a3b679SAndreas Boehler            'foo'                      => ['','foo'],
108*a1a3b679SAndreas Boehler            'foo/'                     => ['','foo'],
109*a1a3b679SAndreas Boehler            '/foo/'                    => ['','foo'],
110*a1a3b679SAndreas Boehler            '/foo'                     => ['','foo'],
111*a1a3b679SAndreas Boehler            ''                         => [null,null],
112*a1a3b679SAndreas Boehler
113*a1a3b679SAndreas Boehler            // UTF-8
114*a1a3b679SAndreas Boehler            "/\xC3\xA0fo\xC3\xB3/bar"  => ["/\xC3\xA0fo\xC3\xB3",'bar'],
115*a1a3b679SAndreas Boehler            "/\xC3\xA0foo/b\xC3\xBCr/" => ["/\xC3\xA0foo","b\xC3\xBCr"],
116*a1a3b679SAndreas Boehler            "foo/\xC3\xA0\xC3\xBCr"    => ["foo","\xC3\xA0\xC3\xBCr"],
117*a1a3b679SAndreas Boehler
118*a1a3b679SAndreas Boehler        ];
119*a1a3b679SAndreas Boehler
120*a1a3b679SAndreas Boehler        foreach ($strings as $input => $expected) {
121*a1a3b679SAndreas Boehler
122*a1a3b679SAndreas Boehler            $output = URLUtil::splitPath($input);
123*a1a3b679SAndreas Boehler            $this->assertEquals($expected, $output, 'The expected output for \'' . $input . '\' was incorrect');
124*a1a3b679SAndreas Boehler
125*a1a3b679SAndreas Boehler
126*a1a3b679SAndreas Boehler        }
127*a1a3b679SAndreas Boehler
128*a1a3b679SAndreas Boehler    }
129*a1a3b679SAndreas Boehler
130*a1a3b679SAndreas Boehler    /**
131*a1a3b679SAndreas Boehler     * @dataProvider resolveData
132*a1a3b679SAndreas Boehler     */
133*a1a3b679SAndreas Boehler    function testResolve($base, $update, $expected) {
134*a1a3b679SAndreas Boehler
135*a1a3b679SAndreas Boehler        $this->assertEquals(
136*a1a3b679SAndreas Boehler            $expected,
137*a1a3b679SAndreas Boehler            URLUtil::resolve($base, $update)
138*a1a3b679SAndreas Boehler        );
139*a1a3b679SAndreas Boehler
140*a1a3b679SAndreas Boehler    }
141*a1a3b679SAndreas Boehler
142*a1a3b679SAndreas Boehler    function resolveData() {
143*a1a3b679SAndreas Boehler
144*a1a3b679SAndreas Boehler        return [
145*a1a3b679SAndreas Boehler            [
146*a1a3b679SAndreas Boehler                'http://example.org/foo/baz',
147*a1a3b679SAndreas Boehler                '/bar',
148*a1a3b679SAndreas Boehler                'http://example.org/bar',
149*a1a3b679SAndreas Boehler            ],
150*a1a3b679SAndreas Boehler            [
151*a1a3b679SAndreas Boehler                'https://example.org/foo',
152*a1a3b679SAndreas Boehler                '//example.net/',
153*a1a3b679SAndreas Boehler                'https://example.net/',
154*a1a3b679SAndreas Boehler            ],
155*a1a3b679SAndreas Boehler            [
156*a1a3b679SAndreas Boehler                'https://example.org/foo',
157*a1a3b679SAndreas Boehler                '?a=b',
158*a1a3b679SAndreas Boehler                'https://example.org/foo?a=b',
159*a1a3b679SAndreas Boehler            ],
160*a1a3b679SAndreas Boehler            [
161*a1a3b679SAndreas Boehler                '//example.org/foo',
162*a1a3b679SAndreas Boehler                '?a=b',
163*a1a3b679SAndreas Boehler                '//example.org/foo?a=b',
164*a1a3b679SAndreas Boehler            ],
165*a1a3b679SAndreas Boehler            // Ports and fragments
166*a1a3b679SAndreas Boehler            [
167*a1a3b679SAndreas Boehler                'https://example.org:81/foo#hey',
168*a1a3b679SAndreas Boehler                '?a=b#c=d',
169*a1a3b679SAndreas Boehler                'https://example.org:81/foo?a=b#c=d',
170*a1a3b679SAndreas Boehler            ],
171*a1a3b679SAndreas Boehler            // Relative.. in-directory paths
172*a1a3b679SAndreas Boehler            [
173*a1a3b679SAndreas Boehler                'http://example.org/foo/bar',
174*a1a3b679SAndreas Boehler                'bar2',
175*a1a3b679SAndreas Boehler                'http://example.org/foo/bar2',
176*a1a3b679SAndreas Boehler            ],
177*a1a3b679SAndreas Boehler            // Now the base path ended with a slash
178*a1a3b679SAndreas Boehler            [
179*a1a3b679SAndreas Boehler                'http://example.org/foo/bar/',
180*a1a3b679SAndreas Boehler                'bar2/bar3',
181*a1a3b679SAndreas Boehler                'http://example.org/foo/bar/bar2/bar3',
182*a1a3b679SAndreas Boehler            ],
183*a1a3b679SAndreas Boehler        ];
184*a1a3b679SAndreas Boehler
185*a1a3b679SAndreas Boehler    }
186*a1a3b679SAndreas Boehler
187*a1a3b679SAndreas Boehler}
188