@@ -812,6 +812,7 @@ fn client_upgrade() {
812
812
fn client_http2_upgrade ( ) {
813
813
use http:: { Method , Response , Version } ;
814
814
use hyper:: service:: service_fn;
815
+ use tokio:: io:: { AsyncReadExt , AsyncWriteExt } ;
815
816
use tokio:: net:: TcpListener ;
816
817
817
818
let _ = pretty_env_logger:: try_init ( ) ;
@@ -834,7 +835,7 @@ fn client_http2_upgrade() {
834
835
let _ = builder
835
836
. serve_connection_with_upgrades (
836
837
stream,
837
- service_fn ( |req| async move {
838
+ service_fn ( |mut req| async move {
838
839
assert_eq ! ( req. headers( ) . get( "host" ) , None ) ;
839
840
assert_eq ! ( req. version( ) , Version :: HTTP_2 ) ;
840
841
assert_eq ! (
@@ -845,7 +846,22 @@ fn client_http2_upgrade() {
845
846
req. extensions( ) . get:: <hyper:: ext:: Protocol >( ) ,
846
847
Some ( & hyper:: ext:: Protocol :: from_static( "websocket" ) )
847
848
) ;
848
- Ok :: < _ , hyper:: Error > ( Response :: new ( Empty :: < Bytes > :: default ( ) ) )
849
+
850
+ let on_upgrade = req. extensions_mut ( ) . remove :: < hyper:: upgrade:: OnUpgrade > ( ) ;
851
+ tokio:: spawn ( async move {
852
+ let on_upgrade = on_upgrade. unwrap ( ) ;
853
+ let upgraded = on_upgrade. await . unwrap ( ) ;
854
+ let mut io = TokioIo :: new ( upgraded) ;
855
+
856
+ let mut vec = vec ! [ ] ;
857
+ io. read_buf ( & mut vec) . await . unwrap ( ) ;
858
+ assert_eq ! ( vec, b"foo=bar" ) ;
859
+ io. write_all ( b"bar=foo" ) . await . unwrap ( ) ;
860
+ } ) ;
861
+
862
+ Ok :: < _ , hyper:: Error > ( Response :: new ( Full :: < Bytes > :: new ( Bytes :: from_static (
863
+ b"foobar=ready" ,
864
+ ) ) ) )
849
865
} ) ,
850
866
)
851
867
. await
@@ -866,7 +882,14 @@ fn client_http2_upgrade() {
866
882
867
883
assert_eq ! ( res. status( ) , 200 ) ;
868
884
assert_eq ! ( res. version( ) , Version :: HTTP_2 ) ;
869
- let _ = rt. block_on ( hyper:: upgrade:: on ( res) ) . expect ( "on_upgrade" ) ;
885
+
886
+ let upgraded = rt. block_on ( hyper:: upgrade:: on ( res) ) . expect ( "on_upgrade" ) ;
887
+ let mut io = TokioIo :: new ( upgraded) ;
888
+
889
+ rt. block_on ( io. write_all ( b"foo=bar" ) ) . unwrap ( ) ;
890
+ let mut vec = vec ! [ ] ;
891
+ rt. block_on ( io. read_to_end ( & mut vec) ) . unwrap ( ) ;
892
+ assert_eq ! ( vec, b"bar=foo" ) ;
870
893
}
871
894
872
895
#[ cfg( not( miri) ) ]
0 commit comments