Il nome host deve corrispondere alla sintassi seguente:
hostname = domainlabel [ "." ] | 1*( domainlabel "." ) toplabel [ "." ]
domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
toplabel = alpha | alpha *( alphanum | "-" ) alphanum
Come puoi vedere, solo .e -sono ammessi, _non lo è.
Quindi dici che //5-12-145-35_s-81:443è permesso, e lo è, ma non per il nome host .
Per vedere come funziona:
URI uriBadHost = URI.create("//5-12-145-35_s-81:443");
System.out.println("uri = " + uriBadHost);
System.out.println(" authority = " + uriBadHost.getAuthority());
System.out.println(" host = " + uriBadHost.getHost());
System.out.println(" port = " + uriBadHost.getPort());
URI uriGoodHost = URI.create("//example.com:443");
System.out.println("uri = " + uriGoodHost);
System.out.println(" authority = " + uriGoodHost.getAuthority());
System.out.println(" host = " + uriGoodHost.getHost());
System.out.println(" port = " + uriGoodHost.getPort());
Produzione
uri = //5-12-145-35_s-81:443
authority = 5-12-145-35_s-81:443
host = null
port = -1
uri = //example.com:443
authority = example.com:443
host = example.com
port = 443
Come si può vedere, quando l' authorityha un nome host valido, l' hoste portvengono analizzati, ma quando non è valida, la authorityviene trattato come testo a mano libera, e non analizzato ulteriormente.
AGGIORNARE
Dal commento:
System.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))uscite: /// 5-12-145-35_s-81: 443. Lo sto dando come nome host
Il URIcostruttore che stai chiamando è un metodo pratico e crea semplicemente una stringa URI completa e quindi analizza quello.
Il passaggio "5-12-145-35_s-81", 443diventa //5-12-145-35_s-81:443.
Il passaggio "/5-12-145-35_s-81", 443diventa ///5-12-145-35_s-81:443.
Nel primo, è un host e una porta e non riesce ad analizzare.
Nel secondo la parte di autorità è vuota ed /5-12-145-35_s-81:443è un percorso .
URI uri1 = new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null);
System.out.println("uri = " + uri1);
System.out.println(" authority = " + uri1.getAuthority());
System.out.println(" host = " + uri1.getHost());
System.out.println(" port = " + uri1.getPort());
System.out.println(" path = " + uri1.getPath());
Produzione
uri = ///5-12-145-35_s-81:443
authority = null
host = null
port = -1
path = /5-12-145-35_s-81:443