Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
4.5.2
Description
RFC 6874 states that, when constructing a URL with an LLv6 literal, the % sign that prefixes the ZoneID must be quoted as %25. E.g., the LLv6 address
fe80::221:b7ff:fe8a:57d5%en4 should be specified as scheme://[fe80::221:b7ff:fe8a:57d5%25en4]/... in a URL.
httpclient does not seem to support quoted host literals:
Example:
Request.Get("http://[fe80::221:b7ff:fe8a:57d5%25en4]/")
.connectTimeout(1000)
.socketTimeout(1000)
.execute().returnContent().asString();
results in
java.net.UnknownHostException: no such interface 25en4 at java.net.Inet6Address.initstr(Inet6Address.java:487) at java.net.Inet6Address.<init>(Inet6Address.java:408) at java.net.InetAddress.getAllByName(InetAddress.java:1181) at java.net.InetAddress.getAllByName(InetAddress.java:1126) at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45) at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:111) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55) at org.apache.http.client.fluent.Request.internalExecute(Request.java:173) at org.apache.http.client.fluent.Request.execute(Request.java:177) at Test.name(Test.java:12) [...]
It appears that httpclient directly passes the host literal [fe80::221:b7ff:fe8a:57d5%25en4] to the Java standard method InetAddress.getAllByName(host), which does not support the URL quoting that RFC 6874 prescribes.