@@ -35,6 +35,7 @@ use base::worker;
35
35
use base:: worker:: TerminationToken ;
36
36
use base:: WorkerKind ;
37
37
use deno:: DenoOptionsBuilder ;
38
+ use deno_core:: error:: AnyError ;
38
39
use deno_core:: serde_json:: json;
39
40
use deno_core:: serde_json:: { self } ;
40
41
use deno_facade:: generate_binary_eszip;
@@ -79,14 +80,17 @@ use tokio::io::AsyncReadExt;
79
80
use tokio:: io:: AsyncWrite ;
80
81
use tokio:: io:: AsyncWriteExt ;
81
82
use tokio:: join;
83
+ use tokio:: net:: TcpListener ;
82
84
use tokio:: net:: TcpStream ;
83
85
use tokio:: sync:: mpsc;
84
86
use tokio:: sync:: oneshot;
85
87
use tokio:: time:: sleep;
86
88
use tokio:: time:: timeout;
89
+ use tokio_rustls:: rustls;
87
90
use tokio_rustls:: rustls:: pki_types:: ServerName ;
88
91
use tokio_rustls:: rustls:: ClientConfig ;
89
92
use tokio_rustls:: rustls:: RootCertStore ;
93
+ use tokio_rustls:: TlsAcceptor ;
90
94
use tokio_rustls:: TlsConnector ;
91
95
use tokio_util:: compat:: TokioAsyncReadCompatExt ;
92
96
use tokio_util:: sync:: CancellationToken ;
@@ -2309,6 +2313,109 @@ async fn test_declarative_style_fetch_handler() {
2309
2313
) ;
2310
2314
}
2311
2315
2316
+ #[ tokio:: test]
2317
+ #[ serial]
2318
+ async fn test_issue_208 ( ) {
2319
+ async fn create_simple_server (
2320
+ tls : Option < Tls > ,
2321
+ token : CancellationToken ,
2322
+ ) -> Result < ( ) , AnyError > {
2323
+ let config = Arc :: new ( tls. server_config ( ) ) ;
2324
+ let acceptor = TlsAcceptor :: from ( config) ;
2325
+ let listener =
2326
+ TcpListener :: bind ( format ! ( "127.0.0.1:{}" , tls. port( ) ) ) . await ?;
2327
+ loop {
2328
+ let acceptor = acceptor. clone ( ) ;
2329
+ tokio:: select! {
2330
+ Ok ( ( stream, _) ) = listener. accept( ) => {
2331
+ tokio:: spawn( async move {
2332
+ if let Ok ( tls_stream) = acceptor. accept( stream) . await {
2333
+ let _ = hyper:: server:: conn:: Http :: new( ) . serve_connection(
2334
+ tls_stream,
2335
+ hyper:: service:: service_fn( |_req: _| async {
2336
+ Ok :: <_, hyper:: Error >( hyper:: Response :: new( Body :: from( "meow" ) ) )
2337
+ } )
2338
+ )
2339
+ . await
2340
+ . ok( ) ;
2341
+ }
2342
+ } ) ;
2343
+ }
2344
+ _ = token. cancelled( ) => {
2345
+ break ;
2346
+ }
2347
+ }
2348
+ }
2349
+ Ok ( ( ) )
2350
+ }
2351
+
2352
+ let tls = new_localhost_tls ( true ) ;
2353
+ let port = tls. port ( ) ;
2354
+ let token = CancellationToken :: new ( ) ;
2355
+ let server = tokio:: spawn ( {
2356
+ let token = token. clone ( ) ;
2357
+ async move {
2358
+ create_simple_server ( tls, token) . await . unwrap ( ) ;
2359
+ }
2360
+ } ) ;
2361
+
2362
+ {
2363
+ let client = Client :: new ( ) ;
2364
+ let builder = client
2365
+ . request (
2366
+ Method :: POST ,
2367
+ format ! ( "http://localhost:{}/issue-208" , NON_SECURE_PORT ) ,
2368
+ )
2369
+ . header ( "x-port" , port)
2370
+ . body ( TLS_LOCALHOST_ROOT_CA ) ;
2371
+
2372
+ integration_test ! (
2373
+ "./test_cases/main" ,
2374
+ NON_SECURE_PORT ,
2375
+ "" ,
2376
+ None ,
2377
+ Some ( builder) ,
2378
+ None ,
2379
+ ( |resp| async {
2380
+ let resp = resp. unwrap( ) ;
2381
+ assert!( resp. status( ) . as_u16( ) == 200 ) ;
2382
+ assert_eq!( resp. text( ) . await . unwrap( ) , "meow" ) ;
2383
+ } ) ,
2384
+ TerminationToken :: new( )
2385
+ ) ;
2386
+ }
2387
+
2388
+ // unknown issuer
2389
+ {
2390
+ let client = Client :: new ( ) ;
2391
+ let builder = client
2392
+ . request (
2393
+ Method :: GET ,
2394
+ format ! ( "http://localhost:{}/issue-208" , NON_SECURE_PORT ) ,
2395
+ )
2396
+ . header ( "x-port" , port) ;
2397
+
2398
+ integration_test ! (
2399
+ "./test_cases/main" ,
2400
+ NON_SECURE_PORT ,
2401
+ "" ,
2402
+ None ,
2403
+ Some ( builder) ,
2404
+ None ,
2405
+ ( |resp| async {
2406
+ let resp = resp. unwrap( ) ;
2407
+ assert!( resp. status( ) . as_u16( ) == 500 ) ;
2408
+ let reason = resp. text( ) . await . unwrap( ) ;
2409
+ assert!( reason. contains( "invalid peer certificate: UnknownIssuer" ) ) ;
2410
+ } ) ,
2411
+ TerminationToken :: new( )
2412
+ ) ;
2413
+ }
2414
+
2415
+ token. cancel ( ) ;
2416
+ server. await . unwrap ( ) ;
2417
+ }
2418
+
2312
2419
#[ tokio:: test]
2313
2420
#[ serial]
2314
2421
async fn test_issue_420 ( ) {
@@ -3713,6 +3820,7 @@ trait TlsExt {
3713
3820
fn sock_addr ( & self ) -> SocketAddr ;
3714
3821
fn port ( & self ) -> u16 ;
3715
3822
fn stream ( & self ) -> BoxFuture < ' static , Box < dyn AsyncReadWrite > > ;
3823
+ fn server_config ( & self ) -> rustls:: ServerConfig ;
3716
3824
}
3717
3825
3718
3826
impl TlsExt for Option < Tls > {
@@ -3792,6 +3900,26 @@ impl TlsExt for Option<Tls> {
3792
3900
}
3793
3901
. boxed ( )
3794
3902
}
3903
+
3904
+ fn server_config ( & self ) -> rustls:: ServerConfig {
3905
+ assert ! ( self . is_some( ) ) ;
3906
+ let certs =
3907
+ rustls_pemfile:: certs ( & mut std:: io:: BufReader :: new ( TLS_LOCALHOST_CERT ) )
3908
+ . flatten ( )
3909
+ . collect ( ) ;
3910
+ let key = rustls_pemfile:: private_key ( & mut std:: io:: BufReader :: new (
3911
+ TLS_LOCALHOST_KEY ,
3912
+ ) )
3913
+ . into_iter ( )
3914
+ . flatten ( )
3915
+ . next ( )
3916
+ . unwrap ( ) ;
3917
+
3918
+ rustls:: ServerConfig :: builder ( )
3919
+ . with_no_client_auth ( )
3920
+ . with_single_cert ( certs, key)
3921
+ . unwrap ( )
3922
+ }
3795
3923
}
3796
3924
3797
3925
fn new_localhost_tls ( secure : bool ) -> Option < Tls > {
0 commit comments