Запуск этого кода с JDK 1.8:
try {
System.out.println( new URI(null, null, "5-12-145-35_s-81", 443, null, null, null));
} catch (URISyntaxException e) {
e.printStackTrace();
}
приводит к этой ошибке: java.net.URISyntaxException: Illegal character in hostname at index 13: //5-12-145-35_s-81:443
Откуда эта ошибка, учитывая, что все символы имени хоста кажутся допустимыми, в соответствии с типами символов URI ?
Если я использую эти URL-адреса: //5-12-145-35_s-81:443
или /5-12-145-35_s-81:443
ошибка исчезла.
Из комментариев я понимаю, что, согласно RFC-2396 , имя хоста не может содержать символов подчеркивания.
Вопрос, который все еще остается, состоит в том, почему имя хоста, начинающееся с косой черты или двойной косой черты, может содержать подчеркивания?
-
, разделенных точкамиОтветы:
Имя хоста должно соответствовать следующему синтаксису:
Как видите, только так
.
и-
разрешено,_
нет.Затем вы говорите, что
//5-12-145-35_s-81:443
разрешено, и это так, но не для имени хоста .Чтобы увидеть, как это получается:
Вывод
Как вы можете видеть, если у
authority
файла есть действительное имя хоста, тоhost
иport
анализируются, но когда они недействительны, ониauthority
обрабатываются как текст произвольной формы и больше не анализируются.ОБНОВИТЬ
Из комментария:
URI
Конструктор вы вызываете удобный метод, и он просто строит полную строку URI , а затем разбирает это.Проходя
"5-12-145-35_s-81", 443
становится//5-12-145-35_s-81:443
.Проходя
"/5-12-145-35_s-81", 443
становится///5-12-145-35_s-81:443
.Во-первых, это хост и порт , и он не может разобрать.
Во втором авторитетная часть пуста и
/5-12-145-35_s-81:443
является путем .Вывод
источник
/a_b
, это разрешено. Единственное отличие состоит в том, что этот является абсолютным, а не относительнымSystem.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))
выходы:///5-12-145-35_s-81:443
. Я даю это как имя хоста.Ошибка не в Java, а в именовании хоста, поскольку подчеркивание не является допустимым символом в имени хоста. Хотя широко используется неправильно, Java отказывается обрабатывать такие имена хостов
источник
/5-12-145-35_s-81:443
законно.Подчеркивания не поддерживаются в URI.
Википедия
От Javadocs:
Javadocs
(Хаки) Решение:
Это было сообщено как - ошибка JDK
источник
null
качестве хоста.