Executando este código com o 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();
}
resulta neste erro: java.net.URISyntaxException: Illegal character in hostname at index 13: //5-12-145-35_s-81:443
De onde vem esse erro, considerando que todos os caracteres do nome do host parecem legítimos, de acordo com Tipos de caracteres URI ?
Se eu usar esses URLs: //5-12-145-35_s-81:443
ou /5-12-145-35_s-81:443
o erro se foi.
Pelos comentários, entendo que, de acordo com a RFC-2396 , o nome do host não pode conter caracteres sublinhados.
A questão que ainda se mantém é por que um nome de host que começa com barra ou barra dupla pode conter sublinhados?
-
, separados por pontosRespostas:
O nome do host deve corresponder à seguinte sintaxe:
Como você pode ver, apenas
.
e-
é permitido,_
não é.Você então diz que
//5-12-145-35_s-81:443
é permitido, e é, mas não para o nome do host .Para ver como isso ocorre:
Resultado
Como você pode ver, quando
authority
tem um nome de host válido, ohost
eport
são analisados, mas quando não é válido, oauthority
é tratado como texto de forma livre, e não analisado mais adiante.ATUALIZAR
Do comentário:
o
URI
construtor que você está chamando é um método de conveniência, e ele cria uma cadeia de URIs completa e analisa isso.Passar
"5-12-145-35_s-81", 443
se torna//5-12-145-35_s-81:443
.Passar
"/5-12-145-35_s-81", 443
se torna///5-12-145-35_s-81:443
.No primeiro, é um host e uma porta , e falha ao analisar.
No segundo, a parte da autoridade está vazia e
/5-12-145-35_s-81:443
é um caminho .Resultado
fonte
/a_b
, é permitido. A única diferença é que este é absoluto, não relativoSystem.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))
saídas:///5-12-145-35_s-81:443
. Estou dando como nome de host.O bug não está em Java, mas em nomear o host, pois um sublinhado não é um caractere válido em um nome de host. Embora amplamente utilizado incorretamente, o Java se recusa a lidar com esses nomes de host
fonte
/5-12-145-35_s-81:443
é legal.Sublinhados não são suportados em URIs.
Wikipedia
De Javadocs:
Javadocs
Solução (Hacky):
Isso foi relatado como - bug do JDK
fonte
null
como host.