@@ -194,17 +194,25 @@ impl IpAddrs {
194
194
None
195
195
}
196
196
197
- pub ( super ) fn split_by_preference ( self ) -> ( IpAddrs , IpAddrs ) {
198
- let preferring_v6 = self . iter
199
- . as_slice ( )
200
- . first ( )
201
- . map ( SocketAddr :: is_ipv6)
202
- . unwrap_or ( false ) ;
203
-
204
- let ( preferred, fallback) = self . iter
205
- . partition :: < Vec < _ > , _ > ( |addr| addr. is_ipv6 ( ) == preferring_v6) ;
206
-
207
- ( IpAddrs :: new ( preferred) , IpAddrs :: new ( fallback) )
197
+ pub ( super ) fn split_by_preference ( self , local_addr : Option < IpAddr > ) -> ( IpAddrs , IpAddrs ) {
198
+ if let Some ( local_addr) = local_addr {
199
+ let preferred = self . iter
200
+ . filter ( |addr| addr. is_ipv6 ( ) == local_addr. is_ipv6 ( ) )
201
+ . collect ( ) ;
202
+
203
+ ( IpAddrs :: new ( preferred) , IpAddrs :: new ( vec ! [ ] ) )
204
+ } else {
205
+ let preferring_v6 = self . iter
206
+ . as_slice ( )
207
+ . first ( )
208
+ . map ( SocketAddr :: is_ipv6)
209
+ . unwrap_or ( false ) ;
210
+
211
+ let ( preferred, fallback) = self . iter
212
+ . partition :: < Vec < _ > , _ > ( |addr| addr. is_ipv6 ( ) == preferring_v6) ;
213
+
214
+ ( IpAddrs :: new ( preferred) , IpAddrs :: new ( fallback) )
215
+ }
208
216
}
209
217
210
218
pub ( super ) fn is_empty ( & self ) -> bool {
@@ -325,14 +333,24 @@ mod tests {
325
333
let v6_addr = ( Ipv6Addr :: new ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ) , 80 ) . into ( ) ;
326
334
327
335
let ( mut preferred, mut fallback) =
328
- IpAddrs { iter : vec ! [ v4_addr, v6_addr] . into_iter ( ) } . split_by_preference ( ) ;
336
+ IpAddrs { iter : vec ! [ v4_addr, v6_addr] . into_iter ( ) } . split_by_preference ( None ) ;
329
337
assert ! ( preferred. next( ) . unwrap( ) . is_ipv4( ) ) ;
330
338
assert ! ( fallback. next( ) . unwrap( ) . is_ipv6( ) ) ;
331
339
332
340
let ( mut preferred, mut fallback) =
333
- IpAddrs { iter : vec ! [ v6_addr, v4_addr] . into_iter ( ) } . split_by_preference ( ) ;
341
+ IpAddrs { iter : vec ! [ v6_addr, v4_addr] . into_iter ( ) } . split_by_preference ( None ) ;
334
342
assert ! ( preferred. next( ) . unwrap( ) . is_ipv6( ) ) ;
335
343
assert ! ( fallback. next( ) . unwrap( ) . is_ipv4( ) ) ;
344
+
345
+ let ( mut preferred, fallback) =
346
+ IpAddrs { iter : vec ! [ v4_addr, v6_addr] . into_iter ( ) } . split_by_preference ( Some ( v4_addr. ip ( ) ) ) ;
347
+ assert ! ( preferred. next( ) . unwrap( ) . is_ipv4( ) ) ;
348
+ assert ! ( fallback. is_empty( ) ) ;
349
+
350
+ let ( mut preferred, fallback) =
351
+ IpAddrs { iter : vec ! [ v4_addr, v6_addr] . into_iter ( ) } . split_by_preference ( Some ( v6_addr. ip ( ) ) ) ;
352
+ assert ! ( preferred. next( ) . unwrap( ) . is_ipv6( ) ) ;
353
+ assert ! ( fallback. is_empty( ) ) ;
336
354
}
337
355
338
356
#[ test]
0 commit comments