Ejecutando este código con 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();
}
da como resultado este error: java.net.URISyntaxException: Illegal character in hostname at index 13: //5-12-145-35_s-81:443
¿De dónde viene este error, teniendo en cuenta que todos los caracteres del nombre de host parecen legítimos, de acuerdo con los tipos de caracteres URI? ?
Si uso estas URL: //5-12-145-35_s-81:443
o/5-12-145-35_s-81:443
el error se ha ido.
Según los comentarios, entiendo que, de acuerdo con RFC-2396 , el nombre de host no puede contener caracteres de subrayado.
La pregunta que aún se mantiene es ¿por qué un nombre de host que comienza con una barra oblicua o una barra doble puede contener guiones bajos?
-
, separados por puntosRespuestas:
El nombre del host debe coincidir con la siguiente sintaxis:
Como puede ver, solo
.
y-
están permitidos,_
no lo está.Luego dice que
//5-12-145-35_s-81:443
está permitido, y lo está, pero no para el nombre de host .Para ver cómo funciona:
Salida
Como puede ver, cuando
authority
tiene un nombre de host válido, se analiza elhost
yport
, pero cuando no es válido,authority
se trata como texto de forma libre y no se analiza más.ACTUALIZAR
De comentario:
El
URI
constructor al que está llamando es un método conveniente, y simplemente crea una cadena de URI completa y luego la analiza.Pasar se
"5-12-145-35_s-81", 443
convierte//5-12-145-35_s-81:443
.Pasar se
"/5-12-145-35_s-81", 443
convierte///5-12-145-35_s-81:443
.En el primero, es un host y un puerto , y no se analiza.
En el segundo, la parte de autoridad está vacía y
/5-12-145-35_s-81:443
es un camino .Salida
fuente
/a_b
, está permitido. La única diferencia es que este es absoluto, no relativoSystem.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))
salidas:///5-12-145-35_s-81:443
. Lo estoy dando como nombre de host.El error no está en Java sino en nombrar el host, ya que un guión bajo no es un carácter válido en un nombre de host. Aunque se usa incorrectamente de manera generalizada, Java se niega a manejar dichos nombres de host
fuente
/5-12-145-35_s-81:443
es legal.Los guiones bajos no son compatibles con los URI.
Wikipedia
De Javadocs:
Javadocs
(Hacky) Solución:
Esto se informó como - error JDK
fuente
null
anfitrión.