Skip to content

Commit 6d6f170

Browse files
committed
fix(client): prefer IPv6 addresses before IPv4 even if resolver ordered differently
1 parent 8805922 commit 6d6f170

File tree

1 file changed

+8
-12
lines changed
  • src/client/legacy/connect

1 file changed

+8
-12
lines changed

src/client/legacy/connect/dns.rs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -214,19 +214,14 @@ impl SocketAddrs {
214214
local_addr_ipv6: Option<Ipv6Addr>,
215215
) -> (SocketAddrs, SocketAddrs) {
216216
match (local_addr_ipv4, local_addr_ipv6) {
217+
// Filter out based on what the local addr can use
217218
(Some(_), None) => (self.filter(SocketAddr::is_ipv4), SocketAddrs::new(vec![])),
218219
(None, Some(_)) => (self.filter(SocketAddr::is_ipv6), SocketAddrs::new(vec![])),
219220
_ => {
220-
let preferring_v6 = self
221-
.iter
222-
.as_slice()
223-
.first()
224-
.map(SocketAddr::is_ipv6)
225-
.unwrap_or(false);
226-
221+
// Happy Eyeballs says we always give a preference to v6 if available
227222
let (preferred, fallback) = self
228223
.iter
229-
.partition::<Vec<_>, _>(|addr| addr.is_ipv6() == preferring_v6);
224+
.partition::<Vec<_>, _>(SocketAddr::is_ipv6);
230225

231226
(SocketAddrs::new(preferred), SocketAddrs::new(fallback))
232227
}
@@ -307,12 +302,13 @@ mod tests {
307302
let v4_addr = (ip_v4, 80).into();
308303
let v6_addr = (ip_v6, 80).into();
309304

305+
// Even if ipv4 started first, prefer ipv6
310306
let (mut preferred, mut fallback) = SocketAddrs {
311307
iter: vec![v4_addr, v6_addr].into_iter(),
312308
}
313309
.split_by_preference(None, None);
314-
assert!(preferred.next().unwrap().is_ipv4());
315-
assert!(fallback.next().unwrap().is_ipv6());
310+
assert!(preferred.next().unwrap().is_ipv6());
311+
assert!(fallback.next().unwrap().is_ipv4());
316312

317313
let (mut preferred, mut fallback) = SocketAddrs {
318314
iter: vec![v6_addr, v4_addr].into_iter(),
@@ -325,8 +321,8 @@ mod tests {
325321
iter: vec![v4_addr, v6_addr].into_iter(),
326322
}
327323
.split_by_preference(Some(ip_v4), Some(ip_v6));
328-
assert!(preferred.next().unwrap().is_ipv4());
329-
assert!(fallback.next().unwrap().is_ipv6());
324+
assert!(preferred.next().unwrap().is_ipv6());
325+
assert!(fallback.next().unwrap().is_ipv4());
330326

331327
let (mut preferred, mut fallback) = SocketAddrs {
332328
iter: vec![v6_addr, v4_addr].into_iter(),

0 commit comments

Comments
 (0)