@@ -122,7 +122,6 @@ pub use registry::{AddAddressResult, AddressRecord, AddressScore};
122
122
use connection:: pool:: { EstablishedConnection , Pool , PoolConfig , PoolEvent } ;
123
123
use connection:: IncomingInfo ;
124
124
use dial_opts:: { DialOpts , PeerCondition } ;
125
- use either:: Either ;
126
125
use futures:: { executor:: ThreadPoolBuilder , prelude:: * , stream:: FusedStream } ;
127
126
use libp2p_core:: connection:: ConnectionId ;
128
127
use libp2p_core:: muxing:: SubstreamBox ;
@@ -138,7 +137,6 @@ use libp2p_core::{
138
137
use registry:: { AddressIntoIter , Addresses } ;
139
138
use smallvec:: SmallVec ;
140
139
use std:: collections:: { HashMap , HashSet } ;
141
- use std:: iter;
142
140
use std:: num:: { NonZeroU32 , NonZeroU8 , NonZeroUsize } ;
143
141
use std:: {
144
142
convert:: TryFrom ,
@@ -507,139 +505,72 @@ where
507
505
508
506
fn dial_with_handler (
509
507
& mut self ,
510
- swarm_dial_opts : DialOpts ,
508
+ dial_opts : DialOpts ,
511
509
handler : <TBehaviour as NetworkBehaviour >:: ConnectionHandler ,
512
510
) -> Result < ( ) , DialError > {
513
- let ( peer_id, addresses, dial_concurrency_factor_override, role_override) =
514
- match swarm_dial_opts. 0 {
515
- // Dial a known peer.
516
- dial_opts:: Opts :: WithPeerId ( dial_opts:: WithPeerId {
517
- peer_id,
518
- condition,
519
- role_override,
520
- dial_concurrency_factor_override,
521
- } )
522
- | dial_opts:: Opts :: WithPeerIdWithAddresses ( dial_opts:: WithPeerIdWithAddresses {
523
- peer_id,
524
- condition,
525
- role_override,
526
- dial_concurrency_factor_override,
527
- ..
528
- } ) => {
529
- // Check [`PeerCondition`] if provided.
530
- let condition_matched = match condition {
531
- PeerCondition :: Disconnected => !self . is_connected ( & peer_id) ,
532
- PeerCondition :: NotDialing => !self . pool . is_dialing ( peer_id) ,
533
- PeerCondition :: Always => true ,
534
- } ;
535
- if !condition_matched {
536
- #[ allow( deprecated) ]
537
- self . behaviour . inject_dial_failure (
538
- Some ( peer_id) ,
539
- handler,
540
- & DialError :: DialPeerConditionFalse ( condition) ,
541
- ) ;
542
-
543
- return Err ( DialError :: DialPeerConditionFalse ( condition) ) ;
544
- }
511
+ let peer_id = dial_opts
512
+ . get_or_parse_peer_id ( )
513
+ . map_err ( DialError :: InvalidPeerId ) ?;
514
+ let condition = dial_opts. peer_condition ( ) ;
515
+
516
+ let should_dial = match ( condition, peer_id) {
517
+ ( PeerCondition :: Always , _) => true ,
518
+ ( PeerCondition :: Disconnected , None ) => true ,
519
+ ( PeerCondition :: NotDialing , None ) => true ,
520
+ ( PeerCondition :: Disconnected , Some ( peer_id) ) => !self . pool . is_connected ( peer_id) ,
521
+ ( PeerCondition :: NotDialing , Some ( peer_id) ) => !self . pool . is_dialing ( peer_id) ,
522
+ } ;
545
523
546
- // Check if peer is banned.
547
- if self . banned_peers . contains ( & peer_id) {
548
- let error = DialError :: Banned ;
549
- #[ allow( deprecated) ]
550
- self . behaviour
551
- . inject_dial_failure ( Some ( peer_id) , handler, & error) ;
552
- return Err ( error) ;
553
- }
524
+ if !should_dial {
525
+ let e = DialError :: DialPeerConditionFalse ( condition) ;
554
526
555
- // Retrieve the addresses to dial.
556
- let addresses = {
557
- let mut addresses = match swarm_dial_opts. 0 {
558
- dial_opts:: Opts :: WithPeerId ( dial_opts:: WithPeerId { .. } ) => {
559
- self . behaviour . addresses_of_peer ( & peer_id)
560
- }
561
- dial_opts:: Opts :: WithPeerIdWithAddresses (
562
- dial_opts:: WithPeerIdWithAddresses {
563
- peer_id,
564
- mut addresses,
565
- extend_addresses_through_behaviour,
566
- ..
567
- } ,
568
- ) => {
569
- if extend_addresses_through_behaviour {
570
- addresses. extend ( self . behaviour . addresses_of_peer ( & peer_id) )
571
- }
572
- addresses
573
- }
574
- dial_opts:: Opts :: WithoutPeerIdWithAddress { .. } => {
575
- unreachable ! ( "Due to outer match." )
576
- }
577
- } ;
527
+ #[ allow( deprecated) ]
528
+ self . behaviour . inject_dial_failure ( peer_id, handler, & e) ;
578
529
579
- let mut unique_addresses = HashSet :: new ( ) ;
580
- addresses. retain ( |addr| {
581
- !self . listened_addrs . values ( ) . flatten ( ) . any ( |a| a == addr)
582
- && unique_addresses. insert ( addr. clone ( ) )
583
- } ) ;
530
+ return Err ( e) ;
531
+ }
584
532
585
- if addresses. is_empty ( ) {
586
- let error = DialError :: NoAddresses ;
587
- #[ allow( deprecated) ]
588
- self . behaviour
589
- . inject_dial_failure ( Some ( peer_id) , handler, & error) ;
590
- return Err ( error) ;
591
- } ;
533
+ if let Some ( peer_id) = peer_id {
534
+ // Check if peer is banned.
535
+ if self . banned_peers . contains ( & peer_id) {
536
+ let error = DialError :: Banned ;
537
+ #[ allow( deprecated) ]
538
+ self . behaviour
539
+ . inject_dial_failure ( Some ( peer_id) , handler, & error) ;
540
+ return Err ( error) ;
541
+ }
542
+ }
592
543
593
- addresses
594
- } ;
544
+ let addresses = {
545
+ let mut addresses = dial_opts . get_addresses ( ) ;
595
546
596
- (
597
- Some ( peer_id) ,
598
- Either :: Left ( addresses. into_iter ( ) ) ,
599
- dial_concurrency_factor_override,
600
- role_override,
601
- )
547
+ if let Some ( peer_id) = peer_id {
548
+ if dial_opts. extend_addresses_through_behaviour ( ) {
549
+ addresses. extend ( self . behaviour . addresses_of_peer ( & peer_id) ) ;
602
550
}
603
- // Dial an unknown peer.
604
- dial_opts:: Opts :: WithoutPeerIdWithAddress (
605
- dial_opts:: WithoutPeerIdWithAddress {
606
- address,
607
- role_override,
608
- } ,
609
- ) => {
610
- // If the address ultimately encapsulates an expected peer ID, dial that peer
611
- // such that any mismatch is detected. We do not "pop off" the `P2p` protocol
612
- // from the address, because it may be used by the `Transport`, i.e. `P2p`
613
- // is a protocol component that can influence any transport, like `libp2p-dns`.
614
- let peer_id = match address
615
- . iter ( )
616
- . last ( )
617
- . and_then ( |p| {
618
- if let Protocol :: P2p ( ma) = p {
619
- Some ( PeerId :: try_from ( ma) )
620
- } else {
621
- None
622
- }
623
- } )
624
- . transpose ( )
625
- {
626
- Ok ( peer_id) => peer_id,
627
- Err ( multihash) => return Err ( DialError :: InvalidPeerId ( multihash) ) ,
628
- } ;
551
+ }
629
552
630
- (
631
- peer_id,
632
- Either :: Right ( iter:: once ( address) ) ,
633
- None ,
634
- role_override,
635
- )
636
- }
553
+ let mut unique_addresses = HashSet :: new ( ) ;
554
+ addresses. retain ( |addr| {
555
+ !self . listened_addrs . values ( ) . flatten ( ) . any ( |a| a == addr)
556
+ && unique_addresses. insert ( addr. clone ( ) )
557
+ } ) ;
558
+
559
+ if addresses. is_empty ( ) {
560
+ let error = DialError :: NoAddresses ;
561
+ #[ allow( deprecated) ]
562
+ self . behaviour . inject_dial_failure ( peer_id, handler, & error) ;
563
+ return Err ( error) ;
637
564
} ;
638
565
566
+ addresses
567
+ } ;
568
+
639
569
let dials = addresses
570
+ . into_iter ( )
640
571
. map ( |a| match p2p_addr ( peer_id, a) {
641
572
Ok ( address) => {
642
- let dial = match role_override {
573
+ let dial = match dial_opts . role_override ( ) {
643
574
Endpoint :: Dialer => self . transport . dial ( address. clone ( ) ) ,
644
575
Endpoint :: Listener => self . transport . dial_as_listener ( address. clone ( ) ) ,
645
576
} ;
@@ -662,8 +593,8 @@ where
662
593
dials,
663
594
peer_id,
664
595
handler,
665
- role_override,
666
- dial_concurrency_factor_override ,
596
+ dial_opts . role_override ( ) ,
597
+ dial_opts . dial_concurrency_override ( ) ,
667
598
) {
668
599
Ok ( _connection_id) => Ok ( ( ) ) ,
669
600
Err ( ( connection_limit, handler) ) => {
@@ -1088,9 +1019,9 @@ where
1088
1019
return Some ( SwarmEvent :: Behaviour ( event) )
1089
1020
}
1090
1021
NetworkBehaviourAction :: Dial { opts, handler } => {
1091
- let peer_id = opts. get_peer_id ( ) ;
1022
+ let peer_id = opts. get_or_parse_peer_id ( ) ;
1092
1023
if let Ok ( ( ) ) = self . dial_with_handler ( opts, handler) {
1093
- if let Some ( peer_id) = peer_id {
1024
+ if let Ok ( Some ( peer_id) ) = peer_id {
1094
1025
return Some ( SwarmEvent :: Dialing ( peer_id) ) ;
1095
1026
}
1096
1027
}
@@ -2516,6 +2447,8 @@ mod tests {
2516
2447
_ => panic ! ( "Was expecting the listen address to be reported" ) ,
2517
2448
} ) ) ;
2518
2449
2450
+ swarm. listened_addrs . clear ( ) ; // This is a hack to actually execute the dial to ourselves which would otherwise be filtered.
2451
+
2519
2452
swarm. dial ( local_address. clone ( ) ) . unwrap ( ) ;
2520
2453
2521
2454
let mut got_dial_err = false ;
0 commit comments