Add ability to specify multiple IP addresses for resolver overrides (#1622)
This change allows the `ClientBuilder::resolve_to_addrs` method to accept a slice of `SocketAddr`s for overriding resolution for a single domain. Allowing multiple IPs more accurately reflects behavior of `getaddrinfo` and allows users to rely on hyper's happy eyeballs algorithm to connect to a host that can accept traffic on IPv4 and IPv6.
This commit is contained in:
@@ -190,6 +190,40 @@ async fn overridden_dns_resolution_with_gai() {
|
||||
assert_eq!("Hello", text);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn overridden_dns_resolution_with_gai_multiple() {
|
||||
let _ = env_logger::builder().is_test(true).try_init();
|
||||
let server = server::http(move |_req| async { http::Response::new("Hello".into()) });
|
||||
|
||||
let overridden_domain = "rust-lang.org";
|
||||
let url = format!(
|
||||
"http://{}:{}/domain_override",
|
||||
overridden_domain,
|
||||
server.addr().port()
|
||||
);
|
||||
// the server runs on IPv4 localhost, so provide both IPv4 and IPv6 and let the happy eyeballs
|
||||
// algorithm decide which address to use.
|
||||
let client = reqwest::Client::builder()
|
||||
.resolve_to_addrs(
|
||||
overridden_domain,
|
||||
&[
|
||||
std::net::SocketAddr::new(
|
||||
std::net::IpAddr::V6(std::net::Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)),
|
||||
server.addr().port(),
|
||||
),
|
||||
server.addr(),
|
||||
],
|
||||
)
|
||||
.build()
|
||||
.expect("client builder");
|
||||
let req = client.get(&url);
|
||||
let res = req.send().await.expect("request");
|
||||
|
||||
assert_eq!(res.status(), reqwest::StatusCode::OK);
|
||||
let text = res.text().await.expect("Failed to get text");
|
||||
assert_eq!("Hello", text);
|
||||
}
|
||||
|
||||
#[cfg(feature = "trust-dns")]
|
||||
#[tokio::test]
|
||||
async fn overridden_dns_resolution_with_trust_dns() {
|
||||
@@ -215,6 +249,42 @@ async fn overridden_dns_resolution_with_trust_dns() {
|
||||
assert_eq!("Hello", text);
|
||||
}
|
||||
|
||||
#[cfg(feature = "trust-dns")]
|
||||
#[tokio::test]
|
||||
async fn overridden_dns_resolution_with_trust_dns_multiple() {
|
||||
let _ = env_logger::builder().is_test(true).try_init();
|
||||
let server = server::http(move |_req| async { http::Response::new("Hello".into()) });
|
||||
|
||||
let overridden_domain = "rust-lang.org";
|
||||
let url = format!(
|
||||
"http://{}:{}/domain_override",
|
||||
overridden_domain,
|
||||
server.addr().port()
|
||||
);
|
||||
// the server runs on IPv4 localhost, so provide both IPv4 and IPv6 and let the happy eyeballs
|
||||
// algorithm decide which address to use.
|
||||
let client = reqwest::Client::builder()
|
||||
.resolve_to_addrs(
|
||||
overridden_domain,
|
||||
&[
|
||||
std::net::SocketAddr::new(
|
||||
std::net::IpAddr::V6(std::net::Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)),
|
||||
server.addr().port(),
|
||||
),
|
||||
server.addr(),
|
||||
],
|
||||
)
|
||||
.trust_dns(true)
|
||||
.build()
|
||||
.expect("client builder");
|
||||
let req = client.get(&url);
|
||||
let res = req.send().await.expect("request");
|
||||
|
||||
assert_eq!(res.status(), reqwest::StatusCode::OK);
|
||||
let text = res.text().await.expect("Failed to get text");
|
||||
assert_eq!("Hello", text);
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "native-tls", feature = "__rustls",))]
|
||||
#[test]
|
||||
fn use_preconfigured_tls_with_bogus_backend() {
|
||||
|
||||
Reference in New Issue
Block a user