@@ -214,12 +214,19 @@ impl SocketAddrs {
214
214
local_addr_ipv6 : Option < Ipv6Addr > ,
215
215
) -> ( SocketAddrs , SocketAddrs ) {
216
216
match ( local_addr_ipv4, local_addr_ipv6) {
217
- // Filter out based on what the local addr can use
218
217
( Some ( _) , None ) => ( self . filter ( SocketAddr :: is_ipv4) , SocketAddrs :: new ( vec ! [ ] ) ) ,
219
218
( None , Some ( _) ) => ( self . filter ( SocketAddr :: is_ipv6) , SocketAddrs :: new ( vec ! [ ] ) ) ,
220
219
_ => {
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) ;
223
230
224
231
( SocketAddrs :: new ( preferred) , SocketAddrs :: new ( fallback) )
225
232
}
@@ -300,13 +307,12 @@ mod tests {
300
307
let v4_addr = ( ip_v4, 80 ) . into ( ) ;
301
308
let v6_addr = ( ip_v6, 80 ) . into ( ) ;
302
309
303
- // Even if ipv4 started first, prefer ipv6
304
310
let ( mut preferred, mut fallback) = SocketAddrs {
305
311
iter : vec ! [ v4_addr, v6_addr] . into_iter ( ) ,
306
312
}
307
313
. 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 ( ) ) ;
310
316
311
317
let ( mut preferred, mut fallback) = SocketAddrs {
312
318
iter : vec ! [ v6_addr, v4_addr] . into_iter ( ) ,
@@ -319,8 +325,8 @@ mod tests {
319
325
iter : vec ! [ v4_addr, v6_addr] . into_iter ( ) ,
320
326
}
321
327
. 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 ( ) ) ;
324
330
325
331
let ( mut preferred, mut fallback) = SocketAddrs {
326
332
iter : vec ! [ v6_addr, v4_addr] . into_iter ( ) ,
0 commit comments