Uploaded image for project: 'HttpComponents HttpClient'
  1. HttpComponents HttpClient
  2. HTTPCLIENT-1795

Http Client does not support RFC-compliant quoted IPv6 Link-Local host literals

    XMLWordPrintableJSON

Details

    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.

      Attachments

        Activity

          People

            Unassigned Unassigned
            andreaswundsm Andreas Wundsam
            Votes:
            0 Vote for this issue
            Watchers:
            7 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: