Skip to content

Commit dd5b31a

Browse files
committed
fix(client): prefer resolver order always
1 parent 2c3c55f commit dd5b31a

File tree

1 file changed

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

1 file changed

+14
-8
lines changed

src/client/legacy/connect/dns.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -214,12 +214,19 @@ 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
218217
(Some(_), None) => (self.filter(SocketAddr::is_ipv4), SocketAddrs::new(vec![])),
219218
(None, Some(_)) => (self.filter(SocketAddr::is_ipv6), SocketAddrs::new(vec![])),
220219
_ => {
221-
// Happy Eyeballs says we always give a preference to v6 if available
222-
let (preferred, fallback) = self.iter.partition::<Vec<_>, _>(SocketAddr::is_ipv6);
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);
223230

224231
(SocketAddrs::new(preferred), SocketAddrs::new(fallback))
225232
}
@@ -300,13 +307,12 @@ mod tests {
300307
let v4_addr = (ip_v4, 80).into();
301308
let v6_addr = (ip_v6, 80).into();
302309

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

311317
let (mut preferred, mut fallback) = SocketAddrs {
312318
iter: vec![v6_addr, v4_addr].into_iter(),
@@ -319,8 +325,8 @@ mod tests {
319325
iter: vec![v4_addr, v6_addr].into_iter(),
320326
}
321327
.split_by_preference(Some(ip_v4), Some(ip_v6));
322-
assert!(preferred.next().unwrap().is_ipv6());
323-
assert!(fallback.next().unwrap().is_ipv4());
328+
assert!(preferred.next().unwrap().is_ipv4());
329+
assert!(fallback.next().unwrap().is_ipv6());
324330

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

0 commit comments

Comments
 (0)