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