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

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

new URI("http:us//er:ps//[email protected]//te.c/om/dir1/di//r2/fi//le.txt#frag//ment");

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

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

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

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

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

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

URI Javadoc утверждает:

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

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

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

Но все равно - зачем и зачем?

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

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

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

+1
источник поделиться
1 ответ

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

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

Вы должны избежать тех, кто находится внутри отрезка пути.

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

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос