11use async_std:: net:: { TcpListener , TcpStream } ;
2+ use async_std:: task;
3+ use async_std:: io;
4+ use async_std:: sync:: channel;
5+ use async_std:: prelude:: * ;
26use async_tls:: { TlsAcceptor , TlsConnector } ;
3- use futures:: executor;
4- use futures:: prelude:: * ;
5- use futures:: task:: SpawnExt ;
67use lazy_static:: lazy_static;
78use rustls:: internal:: pemfile:: { certs, rsa_private_keys} ;
89use rustls:: { ClientConfig , ServerConfig } ;
9- use std:: io:: { BufReader , Cursor } ;
1010use std:: net:: SocketAddr ;
11- use std:: sync :: mpsc :: channel ;
11+ use std:: io :: { BufReader , Cursor } ;
1212use std:: sync:: Arc ;
13- use std:: { io, thread} ;
1413
1514const CERT : & str = include_str ! ( "end.cert" ) ;
1615const CHAIN : & str = include_str ! ( "end.chain" ) ;
@@ -27,38 +26,32 @@ lazy_static! {
2726 . expect( "invalid key or certificate" ) ;
2827 let acceptor = TlsAcceptor :: from( Arc :: new( config) ) ;
2928
30- let ( send, recv) = channel( ) ;
31-
32- thread:: spawn( move || {
33- let done = async {
34- let addr = SocketAddr :: from( ( [ 127 , 0 , 0 , 1 ] , 0 ) ) ;
35- let mut pool = executor:: ThreadPool :: new( ) ?;
36- let listener = TcpListener :: bind( & addr) . await ?;
37-
38- send. send( listener. local_addr( ) ?) . unwrap( ) ;
39-
40- let mut incoming = listener. incoming( ) ;
41- while let Some ( stream) = incoming. next( ) . await {
42- let acceptor = acceptor. clone( ) ;
43- pool. spawn(
44- async move {
45- let stream = acceptor. accept( stream?) . await ?;
46- let ( reader, mut write) = stream. split( ) ;
47- reader. copy_into( & mut write) . await ?;
48- Ok ( ( ) ) as io:: Result <( ) >
49- }
50- . unwrap_or_else( |err| eprintln!( "{:?}" , err) ) ,
51- )
52- . unwrap( ) ;
53- }
54-
55- Ok ( ( ) ) as io:: Result <( ) >
56- } ;
57-
58- executor:: block_on( done) . unwrap( ) ;
29+ let ( send, recv) = channel( 1 ) ;
30+
31+ task:: spawn( async move {
32+ let addr = SocketAddr :: from( ( [ 127 , 0 , 0 , 1 ] , 0 ) ) ;
33+ let listener = TcpListener :: bind( & addr) . await ?;
34+
35+ send. send( listener. local_addr( ) ?) . await ;
36+
37+ let mut incoming = listener. incoming( ) ;
38+ while let Some ( stream) = incoming. next( ) . await {
39+ let acceptor = acceptor. clone( ) ;
40+ task:: spawn( async move {
41+ use futures_util:: io:: AsyncReadExt ;
42+ let stream = acceptor. accept( stream?) . await ?;
43+ let ( mut reader, mut writer) = stream. split( ) ;
44+ io:: copy( & mut reader, & mut writer) . await ?;
45+ Ok ( ( ) ) as io:: Result <( ) >
46+ } ) ;
47+ }
48+
49+ Ok ( ( ) ) as io:: Result <( ) >
5950 } ) ;
6051
61- let addr = recv. recv( ) . unwrap( ) ;
52+ let addr = task:: block_on( async move {
53+ recv. recv( ) . await . unwrap( )
54+ } ) ;
6255 ( addr, "localhost" , CHAIN )
6356 } ;
6457}
@@ -80,7 +73,7 @@ async fn start_client(addr: SocketAddr, domain: &str, config: Arc<ClientConfig>)
8073
8174 assert_eq ! ( buf, FILE ) ;
8275
83- stream. close ( ) . await ?;
76+ stream. flush ( ) . await ?;
8477 Ok ( ( ) )
8578}
8679
@@ -93,7 +86,7 @@ fn pass() {
9386 config. root_store . add_pem_file ( & mut chain) . unwrap ( ) ;
9487 let config = Arc :: new ( config) ;
9588
96- executor :: block_on ( start_client ( addr. clone ( ) , domain, config. clone ( ) ) ) . unwrap ( ) ;
89+ task :: block_on ( start_client ( addr. clone ( ) , domain, config. clone ( ) ) ) . unwrap ( ) ;
9790}
9891
9992#[ test]
@@ -106,5 +99,5 @@ fn fail() {
10699 let config = Arc :: new ( config) ;
107100
108101 assert_ne ! ( domain, & "google.com" ) ;
109- assert ! ( executor :: block_on( start_client( addr. clone( ) , "google.com" , config) ) . is_err( ) ) ;
102+ assert ! ( task :: block_on( start_client( addr. clone( ) , "google.com" , config) ) . is_err( ) ) ;
110103}
0 commit comments