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:443o/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:443está permitido, y lo está, pero no para el nombre de host .Para ver cómo funciona:
Salida
Como puede ver, cuando
authoritytiene un nombre de host válido, se analiza elhostyport, pero cuando no es válido,authorityse trata como texto de forma libre y no se analiza más.ACTUALIZAR
De comentario:
El
URIconstructor 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", 443convierte//5-12-145-35_s-81:443.Pasar se
"/5-12-145-35_s-81", 443convierte///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:443es 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:443es legal.Los guiones bajos no son compatibles con los URI.
Wikipedia
De Javadocs:
Javadocs
(Hacky) Solución:
Esto se informó como - error JDK
fuente
nullanfitrión.