@@ -214,19 +214,12 @@ 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-
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) ;
230223
231224 ( SocketAddrs :: new ( preferred) , SocketAddrs :: new ( fallback) )
232225 }
@@ -307,12 +300,13 @@ mod tests {
307300 let v4_addr = ( ip_v4, 80 ) . into ( ) ;
308301 let v6_addr = ( ip_v6, 80 ) . into ( ) ;
309302
303+ // Even if ipv4 started first, prefer ipv6
310304 let ( mut preferred, mut fallback) = SocketAddrs {
311305 iter : vec ! [ v4_addr, v6_addr] . into_iter ( ) ,
312306 }
313307 . 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 ( ) ) ;
316310
317311 let ( mut preferred, mut fallback) = SocketAddrs {
318312 iter : vec ! [ v6_addr, v4_addr] . into_iter ( ) ,
@@ -325,8 +319,8 @@ mod tests {
325319 iter : vec ! [ v4_addr, v6_addr] . into_iter ( ) ,
326320 }
327321 . 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 ( ) ) ;
330324
331325 let ( mut preferred, mut fallback) = SocketAddrs {
332326 iter : vec ! [ v6_addr, v4_addr] . into_iter ( ) ,
0 commit comments