@@ -305,45 +305,49 @@ fn id_of_output(output: &Output) -> Result<RequestId> {
305
305
306
306
#[ cfg( test) ]
307
307
mod tests {
308
+ use std:: { future:: Future , pin:: Pin } ;
309
+
308
310
use super :: * ;
309
311
use crate :: Error :: Rpc ;
310
- use core :: pin :: Pin ;
311
- use futures :: { lock :: Mutex , Future } ;
312
+ use futures :: lock :: Mutex ;
313
+ use http_body_util :: { BodyExt , Full } ;
312
314
use hyper:: {
313
- body:: HttpBody ,
314
- service:: { make_service_fn, service_fn} ,
315
- Body , Error , Method , Request , Response , Server ,
315
+ body:: { Bytes , Incoming } ,
316
+ server:: conn:: http1,
317
+ service:: service_fn,
318
+ Method , Request , Response ,
316
319
} ;
320
+ use hyper_util:: rt:: TokioIo ;
317
321
use jsonrpc_core:: ErrorCode ;
318
- use std:: net:: TcpListener ;
319
- use tokio:: { task:: JoinHandle , time:: Instant } ;
322
+ use tokio:: { net:: TcpListener , task:: JoinHandle , time:: Instant } ;
320
323
321
- type HyperResponse = Pin < Box < dyn Future < Output = hyper:: Result < Response < Body > > > + Send > > ;
324
+ type HyperResponse =
325
+ Pin < Box < dyn Future < Output = std:: result:: Result < Response < Full < Bytes > > , hyper:: http:: Error > > + Send + Sync > > ;
322
326
323
- type HyperHandler = Box < dyn Fn ( Request < Body > ) -> HyperResponse + Send + Sync > ;
327
+ type HyperHandler = Box < dyn Fn ( Request < Incoming > ) -> HyperResponse + Send + Sync > ;
324
328
325
- fn get_available_port ( ) -> Option < u16 > {
326
- Some ( TcpListener :: bind ( ( "127.0.0.1" , 0 ) ) . ok ( ) ?. local_addr ( ) . ok ( ) ?. port ( ) )
329
+ async fn get_available_port ( ) -> Option < u16 > {
330
+ Some (
331
+ TcpListener :: bind ( ( "127.0.0.1" , 0 ) )
332
+ . await
333
+ . ok ( ) ?
334
+ . local_addr ( )
335
+ . ok ( ) ?
336
+ . port ( ) ,
337
+ )
327
338
}
328
339
329
- fn create_server ( port : u16 , handler : HyperHandler ) -> JoinHandle < ( ) > {
340
+ async fn create_server ( port : u16 , handler : HyperHandler ) -> JoinHandle < ( ) > {
330
341
let addr = format ! ( "127.0.0.1:{}" , port) ;
342
+ let listener = TcpListener :: bind ( addr) . await . unwrap ( ) ;
331
343
let handler = Arc :: new ( handler) ;
332
- let service = make_service_fn ( move |_| {
333
- let handler = handler. clone ( ) ;
334
- async move {
335
- let handler = handler. clone ( ) ;
336
- Ok :: < _ , Error > ( service_fn ( move |req| {
337
- let handler = handler. clone ( ) ;
338
- async move { handler ( req) . await }
339
- } ) )
344
+ tokio:: task:: spawn ( async move {
345
+ loop {
346
+ let ( stream, _) = listener. accept ( ) . await . unwrap ( ) ;
347
+ let service = service_fn ( handler. as_ref ( ) ) ;
348
+ let io = TokioIo :: new ( stream) ;
349
+ http1:: Builder :: new ( ) . serve_connection ( io, service) . await . unwrap ( ) ;
340
350
}
341
- } ) ;
342
-
343
- let server = Server :: bind ( & addr. parse ( ) . unwrap ( ) ) . serve ( service) ;
344
- tokio:: spawn ( async move {
345
- println ! ( "Listening on http://{}" , addr) ;
346
- server. await . unwrap ( ) ;
347
351
} )
348
352
}
349
353
@@ -356,9 +360,9 @@ mod tests {
356
360
}
357
361
358
362
fn return_429 ( retry_after_value : Option < String > ) -> HyperHandler {
359
- Box :: new ( move |_req : Request < Body > | -> HyperResponse {
363
+ Box :: new ( move |_req : Request < Incoming > | -> HyperResponse {
360
364
let retry_after_value = retry_after_value. clone ( ) ;
361
- let response_body = Body :: from (
365
+ let response_body = Bytes :: from (
362
366
r#"{
363
367
"jsonrpc": "2.0",
364
368
"error": {
@@ -373,14 +377,14 @@ mod tests {
373
377
response = response. header ( "Retry-After" , value)
374
378
}
375
379
376
- let response = response. body ( response_body) . unwrap ( ) ;
380
+ let response = response. body ( Full :: new ( response_body) ) . unwrap ( ) ;
377
381
Box :: pin ( async move { Ok ( response) } )
378
382
} )
379
383
}
380
384
381
385
fn return_5xx ( code : u16 ) -> HyperHandler {
382
- Box :: new ( move |_req : Request < Body > | -> HyperResponse {
383
- let response_body = Body :: from (
386
+ Box :: new ( move |_req : Request < Incoming > | -> HyperResponse {
387
+ let response_body = Bytes :: from (
384
388
r#"{
385
389
"jsonrpc": "2.0",
386
390
"error": {
@@ -390,12 +394,12 @@ mod tests {
390
394
}"# ,
391
395
) ;
392
396
393
- let response = Response :: builder ( ) . status ( code) . body ( response_body) . unwrap ( ) ;
397
+ let response = Response :: builder ( ) . status ( code) . body ( Full :: new ( response_body) ) . unwrap ( ) ;
394
398
Box :: pin ( async move { Ok ( response) } )
395
399
} )
396
400
}
397
401
398
- fn check_and_return_mock_response ( req : Request < Body > ) -> HyperResponse {
402
+ fn check_and_return_mock_response ( req : Request < Incoming > ) -> HyperResponse {
399
403
let expected = r#"{"jsonrpc":"2.0","method":"eth_getAccounts","params":[],"id":0}"# ;
400
404
let response = r#"{"jsonrpc":"2.0","id":0,"result":"x"}"# ;
401
405
@@ -405,16 +409,15 @@ mod tests {
405
409
let mut body = req. into_body ( ) ;
406
410
407
411
Box :: pin ( async move {
408
- while let Some ( Ok ( chunk) ) = body. data ( ) . await {
409
- content. extend ( & * chunk) ;
412
+ while let Some ( Ok ( chunk) ) = body. frame ( ) . await {
413
+ content. extend ( chunk. into_data ( ) . unwrap ( ) ) ;
410
414
}
411
- assert_eq ! ( std:: str :: from_utf8( & * content) , Ok ( expected) ) ;
412
-
413
- Ok ( Response :: new ( response. into ( ) ) )
415
+ assert_eq ! ( std:: str :: from_utf8( & content) , Ok ( expected) ) ;
416
+ Response :: builder ( ) . status ( 200 ) . body ( Full :: new ( response. into ( ) ) )
414
417
} )
415
418
}
416
419
417
- fn return_error_response ( _req : Request < Body > ) -> HyperResponse {
420
+ fn return_error_response ( _req : Request < Incoming > ) -> HyperResponse {
418
421
let response = r#"{
419
422
"jsonrpc":"2.0",
420
423
"error":{
@@ -423,12 +426,16 @@ mod tests {
423
426
},
424
427
"id":null
425
428
}"# ;
426
- Box :: pin ( async move { Ok ( Response :: new ( response. into ( ) ) ) } )
429
+ let response = Response :: builder ( )
430
+ . status ( 200 )
431
+ . body ( Full :: new ( response. into ( ) ) )
432
+ . unwrap ( ) ;
433
+ Box :: pin ( async move { Ok ( response) } )
427
434
}
428
435
429
436
fn return_sequence ( handlers : Vec < HyperHandler > ) -> HyperHandler {
430
437
let handlers = Arc :: new ( Mutex :: new ( handlers) ) ;
431
- Box :: new ( move |_req : Request < Body > | -> HyperResponse {
438
+ Box :: new ( move |_req : Request < Incoming > | -> HyperResponse {
432
439
let handlers = handlers. clone ( ) ;
433
440
Box :: pin ( async move {
434
441
let mut handlers = handlers. lock ( ) . await ;
@@ -441,8 +448,8 @@ mod tests {
441
448
#[ tokio:: test]
442
449
async fn should_make_a_request ( ) {
443
450
// given
444
- let port = get_available_port ( ) . unwrap ( ) ;
445
- let _ = create_server ( port, Box :: new ( check_and_return_mock_response) ) ;
451
+ let port = get_available_port ( ) . await . unwrap ( ) ;
452
+ let _ = create_server ( port, Box :: new ( check_and_return_mock_response) ) . await ;
446
453
let client = create_client ( port, Retries :: default ( ) ) ;
447
454
448
455
// when
@@ -457,8 +464,8 @@ mod tests {
457
464
#[ tokio:: test]
458
465
async fn catch_generic_json_error_for_batched_request ( ) {
459
466
// given
460
- let port = get_available_port ( ) . unwrap ( ) ;
461
- let _ = create_server ( port, Box :: new ( return_error_response) ) ;
467
+ let port = get_available_port ( ) . await . unwrap ( ) ;
468
+ let _ = create_server ( port, Box :: new ( return_error_response) ) . await ;
462
469
let client = create_client ( port, Retries :: default ( ) ) ;
463
470
464
471
// when
@@ -505,14 +512,15 @@ mod tests {
505
512
#[ tokio:: test]
506
513
async fn status_code_429_with_retry_after_as_seconds ( ) {
507
514
// given
508
- let port = get_available_port ( ) . unwrap ( ) ;
515
+ let port = get_available_port ( ) . await . unwrap ( ) ;
509
516
let _ = create_server (
510
517
port,
511
518
return_sequence ( vec ! [
512
519
return_429( Some ( "3" . into( ) ) ) ,
513
520
Box :: new( check_and_return_mock_response) ,
514
521
] ) ,
515
- ) ;
522
+ )
523
+ . await ;
516
524
let client = create_client (
517
525
port,
518
526
Retries {
@@ -537,7 +545,7 @@ mod tests {
537
545
#[ tokio:: test]
538
546
async fn status_code_429_with_retry_after_as_date ( ) {
539
547
// given
540
- let port = get_available_port ( ) . unwrap ( ) ;
548
+ let port = get_available_port ( ) . await . unwrap ( ) ;
541
549
let started = Instant :: now ( ) ;
542
550
let retry_after_value: DateTime < Utc > = DateTime :: from ( Utc :: now ( ) + Duration :: from_secs ( 3 ) ) ;
543
551
let _ = create_server (
@@ -546,7 +554,8 @@ mod tests {
546
554
return_429( Some ( retry_after_value. to_rfc2822( ) ) ) ,
547
555
Box :: new( check_and_return_mock_response) ,
548
556
] ) ,
549
- ) ;
557
+ )
558
+ . await ;
550
559
let client = create_client (
551
560
port,
552
561
Retries {
@@ -570,11 +579,12 @@ mod tests {
570
579
#[ tokio:: test]
571
580
async fn status_code_429_with_invalid_retry_after ( ) {
572
581
// given
573
- let port = get_available_port ( ) . unwrap ( ) ;
582
+ let port = get_available_port ( ) . await . unwrap ( ) ;
574
583
let _ = create_server (
575
584
port,
576
585
return_sequence ( vec ! [ return_429( Some ( "retry some time later, idc" . into( ) ) ) ] ) ,
577
- ) ;
586
+ )
587
+ . await ;
578
588
let client = create_client (
579
589
port,
580
590
Retries {
@@ -596,8 +606,8 @@ mod tests {
596
606
#[ tokio:: test]
597
607
async fn status_code_429_without_retry_after ( ) {
598
608
// given
599
- let port = get_available_port ( ) . unwrap ( ) ;
600
- let _ = create_server ( port, return_sequence ( vec ! [ return_429( None ) ] ) ) ;
609
+ let port = get_available_port ( ) . await . unwrap ( ) ;
610
+ let _ = create_server ( port, return_sequence ( vec ! [ return_429( None ) ] ) ) . await ;
601
611
let client = create_client (
602
612
port,
603
613
Retries {
@@ -619,8 +629,8 @@ mod tests {
619
629
#[ tokio:: test]
620
630
async fn status_code_429_retry_after_disabled ( ) {
621
631
// given
622
- let port = get_available_port ( ) . unwrap ( ) ;
623
- let _ = create_server ( port, return_sequence ( vec ! [ return_429( Some ( "3" . into( ) ) ) ] ) ) ;
632
+ let port = get_available_port ( ) . await . unwrap ( ) ;
633
+ let _ = create_server ( port, return_sequence ( vec ! [ return_429( Some ( "3" . into( ) ) ) ] ) ) . await ;
624
634
let client = create_client (
625
635
port,
626
636
Retries {
@@ -642,15 +652,16 @@ mod tests {
642
652
#[ tokio:: test]
643
653
async fn status_code_429_with_retries ( ) {
644
654
// given
645
- let port = get_available_port ( ) . unwrap ( ) ;
655
+ let port = get_available_port ( ) . await . unwrap ( ) ;
646
656
let _ = create_server (
647
657
port,
648
658
return_sequence ( vec ! [
649
659
return_429( Some ( "3" . into( ) ) ) , // sleep for 1 second as configured below
650
660
return_429( Some ( "3" . into( ) ) ) , // sleep for 2 seconds (2x 1sec)
651
661
Box :: new( check_and_return_mock_response) ,
652
662
] ) ,
653
- ) ;
663
+ )
664
+ . await ;
654
665
let client = create_client (
655
666
port,
656
667
Retries {
@@ -675,15 +686,16 @@ mod tests {
675
686
#[ tokio:: test]
676
687
async fn status_code_5xx_with_retries ( ) {
677
688
// given
678
- let port = get_available_port ( ) . unwrap ( ) ;
689
+ let port = get_available_port ( ) . await . unwrap ( ) ;
679
690
let _ = create_server (
680
691
port,
681
692
return_sequence ( vec ! [
682
693
return_5xx( 500 ) , // sleep for 1 second as configured below
683
694
return_5xx( 502 ) , // sleep for 2 seconds (2x 1sec)
684
695
Box :: new( check_and_return_mock_response) ,
685
696
] ) ,
686
- ) ;
697
+ )
698
+ . await ;
687
699
let client = create_client (
688
700
port,
689
701
Retries {
@@ -708,7 +720,7 @@ mod tests {
708
720
#[ tokio:: test]
709
721
async fn status_code_5xx_retries_exhausted ( ) {
710
722
// given
711
- let port = get_available_port ( ) . unwrap ( ) ;
723
+ let port = get_available_port ( ) . await . unwrap ( ) ;
712
724
let _ = create_server (
713
725
port,
714
726
return_sequence ( vec ! [
@@ -717,7 +729,8 @@ mod tests {
717
729
return_5xx( 503 ) ,
718
730
Box :: new( check_and_return_mock_response) ,
719
731
] ) ,
720
- ) ;
732
+ )
733
+ . await ;
721
734
let client = create_client (
722
735
port,
723
736
Retries {
@@ -739,8 +752,8 @@ mod tests {
739
752
#[ tokio:: test]
740
753
async fn status_code_5xx_without_retries ( ) {
741
754
// given
742
- let port = get_available_port ( ) . unwrap ( ) ;
743
- let _ = create_server ( port, return_sequence ( vec ! [ return_5xx( 500 ) ] ) ) ;
755
+ let port = get_available_port ( ) . await . unwrap ( ) ;
756
+ let _ = create_server ( port, return_sequence ( vec ! [ return_5xx( 500 ) ] ) ) . await ;
744
757
let client = create_client (
745
758
port,
746
759
Retries {
0 commit comments