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