diff --git a/crates/test-programs/src/bin/p3_http_outbound_request_response_build.rs b/crates/test-programs/src/bin/p3_http_outbound_request_response_build.rs index 0213986ad4d6..e041628f2e1d 100644 --- a/crates/test-programs/src/bin/p3_http_outbound_request_response_build.rs +++ b/crates/test-programs/src/bin/p3_http_outbound_request_response_build.rs @@ -54,6 +54,9 @@ impl test_programs::p3::exports::wasi::cli::run::Guest for Component { assert!(req.set_authority(Some("bad-port:99999")).is_err()); assert!(req.set_authority(Some("bad-\nhost")).is_err()); assert!(req.set_authority(Some("too-many-ports:80:80:80")).is_err()); + // IPv6 addresses with and without a port should be allowed. + assert!(req.set_authority(Some("[::]:443")).is_ok()); + assert!(req.set_authority(Some("[::]")).is_ok()); assert!( req.set_scheme(Some(&Scheme::Other("bad\nscheme".to_string()))) diff --git a/crates/wasi-http/src/p3/host/types.rs b/crates/wasi-http/src/p3/host/types.rs index 252951688a0c..25af21312113 100644 --- a/crates/wasi-http/src/p3/host/types.rs +++ b/crates/wasi-http/src/p3/host/types.rs @@ -468,7 +468,10 @@ impl HostRequest for WasiHttpCtxView<'_> { req.authority = None; return Ok(Ok(())); }; - let has_port = authority.contains(':'); + let has_port = match authority.rsplit_once(']') { + Some((_, suffix)) => suffix.starts_with(':'), + None => authority.contains(':'), + }; let Ok(authority) = http::uri::Authority::try_from(authority) else { return Ok(Err(())); };