httpc icon indicating copy to clipboard operation
httpc copied to clipboard

IPv6 addresses with brackets are not handled correctly.

Open ahankinson opened this issue 5 months ago • 1 comments

The gleam/uri package handles parsing URIs with brackets correctly, since it uses the regex from rfc3986. As a consequence, it does not handle URIs that do not have brackets.

import gleam/io
import gleam/uri

pub fn main() {
  uri.parse("http://[123:456::789]:8000/com")
  |> io.debug
  // Ok(Uri(scheme: Some("http"), userinfo: None, host: Some("[123:456::789]"), port: Some(8000), path: "/com", query: None, fragment: None))


  uri.parse("http://123:456::789:8000/com")
  |> io.debug
  // Ok(Uri(scheme: Some("http"), userinfo: None, host: Some("123"), port: Some(456), path: "/com", query: None, fragment: None))
}

(The latter case should probably fail instead of producing an invalid host value, but that's another issue).

However, the httpc package is not currently configured to accept IPv6 addresses with brackets. Passing an IPv6 URI from uri.parse will produce value => {error,invalid_uri}

I'm wondering if the underlying erlang httpc module needs to have "ipv6_host_with_brackets" set to True?

https://www.erlang.org/doc/apps/inets/httpc.html#request/4

Here are some public IPv6 URIs to try:

http://[2606:2800:21f:cb07:6820:80da:af6b:8b2c] -> example.net, should give a 404 Not Found http://[2a00:1450:400a:808::200e] -> google.com, should also give a 404

These should both succeed with httpc, and not error out with "invalid URI".

ahankinson avatar Sep 17 '24 15:09 ahankinson