@@ -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