Exécuter ce code avec 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();
}
entraîne cette erreur: java.net.URISyntaxException: Illegal character in hostname at index 13: //5-12-145-35_s-81:443
D'où vient cette erreur, étant donné que tous les caractères du nom d'hôte semblent légitimes, selon types de caractères URI ?
Si j'utilise ces URL: //5-12-145-35_s-81:443
ou /5-12-145-35_s-81:443
l'erreur a disparu.
D'après les commentaires, je comprends que, selon RFC-2396 , le nom d'hôte ne peut contenir aucun caractère de soulignement.
La question qui se pose toujours est pourquoi un nom d'hôte commençant par une barre oblique ou une double barre oblique est autorisé à contenir des traits de soulignement?
-
, séparés par des pointsRéponses:
Le nom d'hôte doit correspondre à la syntaxe suivante:
Comme vous pouvez le voir, seuls
.
et-
sont autorisés,_
ne l'est pas.Vous dites alors que
//5-12-145-35_s-81:443
c'est autorisé, et c'est le cas, mais pas pour nom d'hôte .Pour voir comment cela se déroule:
Production
Comme vous pouvez le voir, lorsque le
authority
a un nom d'hôte valide, lehost
etport
sont analysés, mais lorsqu'ils ne sont pas valides, leauthority
est traité comme du texte de forme libre et n'est pas analysé davantage.MISE À JOUR
Du commentaire:
Le
URI
constructeur que vous appelez est une méthode pratique, et il crée simplement une chaîne URI complète, puis l'analyse.Le passage
"5-12-145-35_s-81", 443
devient//5-12-145-35_s-81:443
.Le passage
"/5-12-145-35_s-81", 443
devient///5-12-145-35_s-81:443
.Dans le premier, c'est un hôte et un port , et ne parvient pas à analyser.
Dans le second, la partie autorité est vide et
/5-12-145-35_s-81:443
est un chemin .Production
la source
/a_b
, est autorisé. La seule différence est que celui-ci est absolu, pas relatifSystem.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))
sorties:///5-12-145-35_s-81:443
. Je le donne comme nom d'hôte.Le bogue n'est pas en Java mais en nommant l'hôte, car un trait de soulignement n'est pas un caractère valide dans un nom d'hôte. Bien que largement utilisé de manière incorrecte, Java refuse de gérer de tels noms d'hôtes
la source
/5-12-145-35_s-81:443
est légal.Les traits de soulignement ne sont pas pris en charge dans les URI.
Wikipédia
De Javadocs:
Javadocs
(Hacky) Solution:
Cela a été signalé comme - bogue JDK
la source
null
hébergé.