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