UrlEncoderTest.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4. * This file is part of the league/commonmark package.
  5. *
  6. * (c) Colin O'Dell <colinodell@gmail.com>
  7. *
  8. * Original code based on the CommonMark JS reference parser (https://bitly.com/commonmark-js)
  9. * - (c) John MacFarlane
  10. *
  11. * For the full copyright and license information, please view the LICENSE
  12. * file that was distributed with this source code.
  13. */
  14. namespace League\CommonMark\Tests\Unit\Util;
  15. use League\CommonMark\Exception\UnexpectedEncodingException;
  16. use League\CommonMark\Util\UrlEncoder;
  17. use PHPUnit\Framework\TestCase;
  18. final class UrlEncoderTest extends TestCase
  19. {
  20. /**
  21. * @dataProvider unescapeAndEncodeTestProvider
  22. */
  23. public function testUnescapeAndEncode(string $input, string $expected): void
  24. {
  25. $this->assertEquals($expected, UrlEncoder::unescapeAndEncode($input));
  26. }
  27. /**
  28. * @return iterable<array<string>>
  29. */
  30. public function unescapeAndEncodeTestProvider(): iterable
  31. {
  32. return [
  33. ['(foo)', '(foo)'],
  34. ['/my uri', '/my%20uri'],
  35. ['`', '%60'],
  36. ['~', '~'],
  37. ['!', '!'],
  38. ['@', '@'],
  39. ['#', '#'],
  40. ['$', '$'],
  41. ['%', '%25'],
  42. ['^', '%5E'],
  43. ['&', '&'],
  44. ['*', '*'],
  45. ['(', '('],
  46. [')', ')'],
  47. ['-', '-'],
  48. ['_', '_'],
  49. ['=', '='],
  50. ['+', '+'],
  51. ['{', '%7B'],
  52. ['}', '%7D'],
  53. ['[', '%5B'],
  54. [']', '%5D'],
  55. ['\\', '%5C'],
  56. ['|', '%7C'],
  57. [';', ';'],
  58. ['\'', '\''],
  59. [':', ':'],
  60. ['"', '%22'],
  61. [',', ','],
  62. ['.', '.'],
  63. ['/', '/'],
  64. ['<', '%3C'],
  65. ['>', '%3E'],
  66. ['?', '?'],
  67. ['%21', '%21'],
  68. ['%23', '%23'],
  69. ['%24', '%24'],
  70. ['%26', '%26'],
  71. ['%27', '%27'],
  72. ['%2A', '%2A'],
  73. ['%2B', '%2B'],
  74. ['%2C', '%2C'],
  75. ['%2D', '%2D'],
  76. ['%2E', '%2E'],
  77. ['%2F', '%2F'],
  78. ['%3A', '%3A'],
  79. ['%3B', '%3B'],
  80. ['%3D', '%3D'],
  81. ['%3F', '%3F'],
  82. ['%40', '%40'],
  83. ['%5F', '%5F'],
  84. ['%7E', '%7E'],
  85. ['%ED', '%ED'],
  86. ['java%0ascript:alert("XSS")', 'java%0ascript:alert(%22XSS%22)'],
  87. ['java%0Ascript:alert("XSS")', 'java%0Ascript:alert(%22XSS%22)'],
  88. ["java\nscript:alert('XSS')", "java%0Ascript:alert('XSS')"],
  89. ['javascript&amp;colon;alert%28&#039;XSS&#039;%29', 'javascript&amp;colon;alert%28&#039;XSS&#039;%29'],
  90. ['https://en.wikipedia.org/wiki/Markdown#CommonMark', 'https://en.wikipedia.org/wiki/Markdown#CommonMark'],
  91. ['https://img.shields.io/badge/help-%23hoaproject-ff0066.svg', 'https://img.shields.io/badge/help-%23hoaproject-ff0066.svg'],
  92. ['http://example.com/a%62%63%2fd%3Fe', 'http://example.com/a%62%63%2fd%3Fe'],
  93. ['http://ko.wikipedia.org/wiki/위키백과:대문', 'http://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC:%EB%8C%80%EB%AC%B8'],
  94. ['http://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC:%EB%8C%80%EB%AC%B8', 'http://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC:%EB%8C%80%EB%AC%B8'],
  95. ['http://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC:%EB%8C%80%EB%AC%B8', 'http://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC:%EB%8C%80%EB%AC%B8'],
  96. ['http://www.inpec.gov.co/portal/page/portal/Inpec/Institucion/Estad%EDsticas/Estadisticas/Informes%20y%20Boletines%20Estad%EDsticos/1%20INFORME%20ENERO%202017.pdf', 'http://www.inpec.gov.co/portal/page/portal/Inpec/Institucion/Estad%EDsticas/Estadisticas/Informes%20y%20Boletines%20Estad%EDsticos/1%20INFORME%20ENERO%202017.pdf'],
  97. ['https://www.example.com/stocks-rise-50%-today.html', 'https://www.example.com/stocks-rise-50%25-today.html'],
  98. ['data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='],
  99. ['data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==', 'data:image/png;base64,%20iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='],
  100. ];
  101. }
  102. public function testInvalidUnicodeProducesAnException(): void
  103. {
  104. $this->expectException(UnexpectedEncodingException::class);
  105. UrlEncoder::unescapeAndEncode(\hex2bin('A5A5A5'));
  106. }
  107. }