1
1
use 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:: * ;
2
6
use async_tls:: { TlsAcceptor , TlsConnector } ;
3
- use futures:: executor;
4
- use futures:: prelude:: * ;
5
- use futures:: task:: SpawnExt ;
6
7
use lazy_static:: lazy_static;
7
8
use rustls:: internal:: pemfile:: { certs, rsa_private_keys} ;
8
9
use rustls:: { ClientConfig , ServerConfig } ;
9
- use std:: io:: { BufReader , Cursor } ;
10
10
use std:: net:: SocketAddr ;
11
- use std:: sync :: mpsc :: channel ;
11
+ use std:: io :: { BufReader , Cursor } ;
12
12
use std:: sync:: Arc ;
13
- use std:: { io, thread} ;
14
13
15
14
const CERT : & str = include_str ! ( "end.cert" ) ;
16
15
const CHAIN : & str = include_str ! ( "end.chain" ) ;
@@ -27,38 +26,32 @@ lazy_static! {
27
26
. expect( "invalid key or certificate" ) ;
28
27
let acceptor = TlsAcceptor :: from( Arc :: new( config) ) ;
29
28
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 <( ) >
59
50
} ) ;
60
51
61
- let addr = recv. recv( ) . unwrap( ) ;
52
+ let addr = task:: block_on( async move {
53
+ recv. recv( ) . await . unwrap( )
54
+ } ) ;
62
55
( addr, "localhost" , CHAIN )
63
56
} ;
64
57
}
@@ -80,7 +73,7 @@ async fn start_client(addr: SocketAddr, domain: &str, config: Arc<ClientConfig>)
80
73
81
74
assert_eq ! ( buf, FILE ) ;
82
75
83
- stream. close ( ) . await ?;
76
+ stream. flush ( ) . await ?;
84
77
Ok ( ( ) )
85
78
}
86
79
@@ -93,7 +86,7 @@ fn pass() {
93
86
config. root_store . add_pem_file ( & mut chain) . unwrap ( ) ;
94
87
let config = Arc :: new ( config) ;
95
88
96
- executor :: block_on ( start_client ( addr. clone ( ) , domain, config. clone ( ) ) ) . unwrap ( ) ;
89
+ task :: block_on ( start_client ( addr. clone ( ) , domain, config. clone ( ) ) ) . unwrap ( ) ;
97
90
}
98
91
99
92
#[ test]
@@ -106,5 +99,5 @@ fn fail() {
106
99
let config = Arc :: new ( config) ;
107
100
108
101
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( ) ) ;
110
103
}
0 commit comments