Почему конструктор URI допускает зарезервированные в процентах зарезервированные специальные символы (косая черта) в своем аргументе URI? - PullRequest
0 голосов
/ 16 декабря 2018

Почему приведенный ниже код не выбрасывает URISyntaxException во время выполнения как недопустимый URI?

new URI("http:us//er:ps//w@si//te.c/om/dir1/di//r2/fi//le.txt#frag//ment");

// or same with "http:// ... "
new URI("http://us//er:ps//w@si//te.c/om/dir1/di//r2/fi//le.txt#frag//ment");

Согласно wikipedia"/" является зарезервированным (специальным) символом ион должен быть закодирован в процентах (или URL-кодирован) как %2F

зарезервированный символ /, например, если используется в компоненте «путь»URI имеет особое значение, являющееся разделителем между путями сегменты . Если в соответствии с заданной схемой URI, / должен находиться в сегменте пути , , тогда три символа %2F или %2f должны использоваться всегмент вместо необработанного /.

Но конструктор URI позволяет не кодировать его по URL-адресу!

Википедия определяет формат URI какследует ( RFC 3986 , раздел 3 (2005) ):

URI = scheme:[//authority]path[?query][#fragment]

И конструктор URI позволяет напрямую использовать / (без кодирования в процентах) влюбой компонент (возможно, за исключением схемы).

URI Javadoc состояния :

Этот конструктор анализирует заданную строку точно так, как указано в RFC2396, Приложение A, за исключением следующих отклонений : ...

Символы в категории other разрешены везде, где RFC 2396 разрешает экранирование октетов , то есть в компонентах пользовательской информации, пути, запроса и фрагмента, а также в компоненте полномочий, еслиПолномочия основаны на реестре.Это позволяет URI содержать символы Unicode, которые не входят в набор символов US-ASCII.

Это позволяет использовать символы "Other", не закодированные в процентах (см. Выше ссылку на вики для зарезервировано / не зарезервировано /уточнение других символов ), например, ɷ (не ASCII), так что речь идет не о зарезервированных символах, таких как косая черта.

Но в любом случае - почему и для чего?почему мы можем использовать прямые косые черты в других компонентах, но почему мы можем использовать их в компоненте пути (имена каталогов, имена файлов), до сих пор неясно.

Зарезервированные символы, которые не имеют зарезервированной цели вконкретный контекст также может быть закодирован в процентах , но семантически не отличается от тех, которые не являются.

В компоненте "query" URI(часть после символа?), например, / по-прежнему считается зарезервированным символом , но обычно не имеет зарезервированной цели , , если только не определен URЯ схема говорит иначе .Символ не должен кодироваться в процентах, если он не имеет зарезервированной цели.

1 Ответ

0 голосов
/ 17 декабря 2018

Хорошо, поэтому вопрос действительно в том, почему элемент пути URI допускает /.

И в первом примечании к Википедии вы показываете, что он четко говорит / является разделителем между сегментами пути. (Элемент пути! = Сегмент пути)

Вы должны экранировать WITHIN сегмент пути.

Вы не должны избегать тех, которые DELIMIT сегменты пути

URI: http://address.com/path%2fSegment1/path%2fSegment2/path%2fSegment3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...