@@ -137,9 +137,10 @@ fn extract_websocket_url(addr: &Multiaddr) -> Option<String> {
137137 _ => return None ,
138138 } ;
139139
140- let ( scheme, wspath) = match protocols. next ( ) {
141- Some ( Protocol :: Ws ( path) ) => ( "ws" , path. into_owned ( ) ) ,
142- Some ( Protocol :: Wss ( path) ) => ( "wss" , path. into_owned ( ) ) ,
140+ let ( scheme, wspath) = match ( protocols. next ( ) , protocols. next ( ) ) {
141+ ( Some ( Protocol :: Tls ) , Some ( Protocol :: Ws ( path) ) ) => ( "wss" , path. into_owned ( ) ) ,
142+ ( Some ( Protocol :: Ws ( path) ) , _) => ( "ws" , path. into_owned ( ) ) ,
143+ ( Some ( Protocol :: Wss ( path) ) , _) => ( "wss" , path. into_owned ( ) ) ,
143144 _ => return None ,
144145 } ;
145146
@@ -453,3 +454,103 @@ impl Drop for Connection {
453454 . clear_interval_with_handle ( self . inner . buffered_amount_low_interval ) ;
454455 }
455456}
457+
458+ #[ cfg( test) ]
459+ mod tests {
460+ use super :: * ;
461+ use libp2p_identity:: PeerId ;
462+
463+ #[ test]
464+ fn extract_url ( ) {
465+ let peer_id = PeerId :: random ( ) ;
466+
467+ // Check `/tls/ws`
468+ let addr = "/dns4/example.com/tcp/2222/tls/ws"
469+ . parse :: < Multiaddr > ( )
470+ . unwrap ( ) ;
471+ let url = extract_websocket_url ( & addr) . unwrap ( ) ;
472+ assert_eq ! ( url, "wss://example.com:2222/" ) ;
473+
474+ // Check `/tls/ws` with `/p2p`
475+ let addr = format ! ( "/dns4/example.com/tcp/2222/tls/ws/p2p/{peer_id}" )
476+ . parse ( )
477+ . unwrap ( ) ;
478+ let url = extract_websocket_url ( & addr) . unwrap ( ) ;
479+ assert_eq ! ( url, "wss://example.com:2222/" ) ;
480+
481+ // Check `/tls/ws` with `/ip4`
482+ let addr = "/ip4/127.0.0.1/tcp/2222/tls/ws"
483+ . parse :: < Multiaddr > ( )
484+ . unwrap ( ) ;
485+ let url = extract_websocket_url ( & addr) . unwrap ( ) ;
486+ assert_eq ! ( url, "wss://127.0.0.1:2222/" ) ;
487+
488+ // Check `/tls/ws` with `/ip6`
489+ let addr = "/ip6/::1/tcp/2222/tls/ws" . parse :: < Multiaddr > ( ) . unwrap ( ) ;
490+ let url = extract_websocket_url ( & addr) . unwrap ( ) ;
491+ assert_eq ! ( url, "wss://[::1]:2222/" ) ;
492+
493+ // Check `/wss`
494+ let addr = "/dns4/example.com/tcp/2222/wss"
495+ . parse :: < Multiaddr > ( )
496+ . unwrap ( ) ;
497+ let url = extract_websocket_url ( & addr) . unwrap ( ) ;
498+ assert_eq ! ( url, "wss://example.com:2222/" ) ;
499+
500+ // Check `/wss` with `/p2p`
501+ let addr = format ! ( "/dns4/example.com/tcp/2222/wss/p2p/{peer_id}" )
502+ . parse ( )
503+ . unwrap ( ) ;
504+ let url = extract_websocket_url ( & addr) . unwrap ( ) ;
505+ assert_eq ! ( url, "wss://example.com:2222/" ) ;
506+
507+ // Check `/wss` with `/ip4`
508+ let addr = "/ip4/127.0.0.1/tcp/2222/wss" . parse :: < Multiaddr > ( ) . unwrap ( ) ;
509+ let url = extract_websocket_url ( & addr) . unwrap ( ) ;
510+ assert_eq ! ( url, "wss://127.0.0.1:2222/" ) ;
511+
512+ // Check `/wss` with `/ip6`
513+ let addr = "/ip6/::1/tcp/2222/wss" . parse :: < Multiaddr > ( ) . unwrap ( ) ;
514+ let url = extract_websocket_url ( & addr) . unwrap ( ) ;
515+ assert_eq ! ( url, "wss://[::1]:2222/" ) ;
516+
517+ // Check `/ws`
518+ let addr = "/dns4/example.com/tcp/2222/ws"
519+ . parse :: < Multiaddr > ( )
520+ . unwrap ( ) ;
521+ let url = extract_websocket_url ( & addr) . unwrap ( ) ;
522+ assert_eq ! ( url, "ws://example.com:2222/" ) ;
523+
524+ // Check `/ws` with `/p2p`
525+ let addr = format ! ( "/dns4/example.com/tcp/2222/ws/p2p/{peer_id}" )
526+ . parse ( )
527+ . unwrap ( ) ;
528+ let url = extract_websocket_url ( & addr) . unwrap ( ) ;
529+ assert_eq ! ( url, "ws://example.com:2222/" ) ;
530+
531+ // Check `/ws` with `/ip4`
532+ let addr = "/ip4/127.0.0.1/tcp/2222/ws" . parse :: < Multiaddr > ( ) . unwrap ( ) ;
533+ let url = extract_websocket_url ( & addr) . unwrap ( ) ;
534+ assert_eq ! ( url, "ws://127.0.0.1:2222/" ) ;
535+
536+ // Check `/ws` with `/ip6`
537+ let addr = "/ip6/::1/tcp/2222/ws" . parse :: < Multiaddr > ( ) . unwrap ( ) ;
538+ let url = extract_websocket_url ( & addr) . unwrap ( ) ;
539+ assert_eq ! ( url, "ws://[::1]:2222/" ) ;
540+
541+ // Check `/ws` with `/ip4`
542+ let addr = "/ip4/127.0.0.1/tcp/2222/ws" . parse :: < Multiaddr > ( ) . unwrap ( ) ;
543+ let url = extract_websocket_url ( & addr) . unwrap ( ) ;
544+ assert_eq ! ( url, "ws://127.0.0.1:2222/" ) ;
545+
546+ // Check that `/tls/wss` is invalid
547+ let addr = "/ip4/127.0.0.1/tcp/2222/tls/wss"
548+ . parse :: < Multiaddr > ( )
549+ . unwrap ( ) ;
550+ assert ! ( extract_websocket_url( & addr) . is_none( ) ) ;
551+
552+ // Check non-ws address
553+ let addr = "/ip4/127.0.0.1/tcp/2222" . parse :: < Multiaddr > ( ) . unwrap ( ) ;
554+ assert ! ( extract_websocket_url( & addr) . is_none( ) ) ;
555+ }
556+ }
0 commit comments