Skip to content

Commit d3b8440

Browse files
authored
fix(client): prefer IPv6 addresses before IPv4 even if resolver ordered differently (#194)
1 parent 8805922 commit d3b8440

File tree

1 file changed

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

1 file changed

+8
-14
lines changed

src/client/legacy/connect/dns.rs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -214,19 +214,12 @@ 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-
227-
let (preferred, fallback) = self
228-
.iter
229-
.partition::<Vec<_>, _>(|addr| addr.is_ipv6() == preferring_v6);
221+
// Happy Eyeballs says we always give a preference to v6 if available
222+
let (preferred, fallback) = self.iter.partition::<Vec<_>, _>(SocketAddr::is_ipv6);
230223

231224
(SocketAddrs::new(preferred), SocketAddrs::new(fallback))
232225
}
@@ -307,12 +300,13 @@ mod tests {
307300
let v4_addr = (ip_v4, 80).into();
308301
let v6_addr = (ip_v6, 80).into();
309302

303+
// Even if ipv4 started first, prefer ipv6
310304
let (mut preferred, mut fallback) = SocketAddrs {
311305
iter: vec![v4_addr, v6_addr].into_iter(),
312306
}
313307
.split_by_preference(None, None);
314-
assert!(preferred.next().unwrap().is_ipv4());
315-
assert!(fallback.next().unwrap().is_ipv6());
308+
assert!(preferred.next().unwrap().is_ipv6());
309+
assert!(fallback.next().unwrap().is_ipv4());
316310

317311
let (mut preferred, mut fallback) = SocketAddrs {
318312
iter: vec![v6_addr, v4_addr].into_iter(),
@@ -325,8 +319,8 @@ mod tests {
325319
iter: vec![v4_addr, v6_addr].into_iter(),
326320
}
327321
.split_by_preference(Some(ip_v4), Some(ip_v6));
328-
assert!(preferred.next().unwrap().is_ipv4());
329-
assert!(fallback.next().unwrap().is_ipv6());
322+
assert!(preferred.next().unwrap().is_ipv6());
323+
assert!(fallback.next().unwrap().is_ipv4());
330324

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

0 commit comments

Comments
 (0)