@@ -39,13 +39,6 @@ macro_rules! test {
39
39
request: { $(
40
40
$c_req_prop: ident: $c_req_val: tt,
41
41
) * } ,
42
- /*
43
- method: $client_method:ident,
44
- url: $client_url:expr,
45
- headers: { $($request_header_name:expr => $request_header_val:expr,)* },
46
- body: $request_body:expr,
47
- },
48
- */
49
42
50
43
response:
51
44
status: $client_status: ident,
@@ -299,6 +292,10 @@ macro_rules! __client_req_prop {
299
292
$req_builder. method( Method :: $method) ;
300
293
} ) ;
301
294
295
+ ( $req_builder: ident, $body: ident, $addr: ident, version: $version: ident) => ( {
296
+ $req_builder. version( hyper:: Version :: $version) ;
297
+ } ) ;
298
+
302
299
( $req_builder: ident, $body: ident, $addr: ident, url: $url: expr) => ( {
303
300
$req_builder. uri( format!( $url, addr=$addr) ) ;
304
301
} ) ;
@@ -724,6 +721,38 @@ test! {
724
721
body: None ,
725
722
}
726
723
724
+ test ! {
725
+ name: client_h1_rejects_http2,
726
+
727
+ server:
728
+ expected: "won't get here {addr}" ,
729
+ reply: "won't reply" ,
730
+
731
+ client:
732
+ request: {
733
+ method: GET ,
734
+ url: "http://{addr}/" ,
735
+ version: HTTP_2 ,
736
+ } ,
737
+ error: |err| err. to_string( ) == "request has unsupported HTTP version" ,
738
+ }
739
+
740
+ test ! {
741
+ name: client_always_rejects_http09,
742
+
743
+ server:
744
+ expected: "won't get here {addr}" ,
745
+ reply: "won't reply" ,
746
+
747
+ client:
748
+ request: {
749
+ method: GET ,
750
+ url: "http://{addr}/" ,
751
+ version: HTTP_09 ,
752
+ } ,
753
+ error: |err| err. to_string( ) == "request has unsupported HTTP version" ,
754
+ }
755
+
727
756
mod dispatch_impl {
728
757
use super :: * ;
729
758
use std:: io:: { self , Read , Write } ;
@@ -1804,6 +1833,52 @@ mod conn {
1804
1833
rt. block_on ( res. join ( rx) . map ( |r| r. 0 ) ) . unwrap ( ) ;
1805
1834
}
1806
1835
1836
+ #[ test]
1837
+ fn http1_conn_coerces_http2_request ( ) {
1838
+ let server = TcpListener :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
1839
+ let addr = server. local_addr ( ) . unwrap ( ) ;
1840
+ let mut rt = Runtime :: new ( ) . unwrap ( ) ;
1841
+
1842
+ let ( tx1, rx1) = oneshot:: channel ( ) ;
1843
+
1844
+ thread:: spawn ( move || {
1845
+ let mut sock = server. accept ( ) . unwrap ( ) . 0 ;
1846
+ sock. set_read_timeout ( Some ( Duration :: from_secs ( 5 ) ) ) . unwrap ( ) ;
1847
+ sock. set_write_timeout ( Some ( Duration :: from_secs ( 5 ) ) ) . unwrap ( ) ;
1848
+ let mut buf = [ 0 ; 4096 ] ;
1849
+ let n = sock. read ( & mut buf) . expect ( "read 1" ) ;
1850
+
1851
+ // Not HTTP/2, nor panicked
1852
+ let expected = "GET /a HTTP/1.1\r \n \r \n " ;
1853
+ assert_eq ! ( s( & buf[ ..n] ) , expected) ;
1854
+
1855
+ sock. write_all ( b"HTTP/1.1 200 OK\r \n Content-Length: 0\r \n \r \n " ) . unwrap ( ) ;
1856
+ let _ = tx1. send ( ( ) ) ;
1857
+ } ) ;
1858
+
1859
+ let tcp = rt. block_on ( tcp_connect ( & addr) ) . unwrap ( ) ;
1860
+
1861
+ let ( mut client, conn) = rt. block_on ( conn:: handshake ( tcp) ) . unwrap ( ) ;
1862
+
1863
+ rt. spawn ( conn. map ( |_| ( ) ) . map_err ( |e| panic ! ( "conn error: {}" , e) ) ) ;
1864
+
1865
+ let req = Request :: builder ( )
1866
+ . uri ( "/a" )
1867
+ . version ( hyper:: Version :: HTTP_2 )
1868
+ . body ( Default :: default ( ) )
1869
+ . unwrap ( ) ;
1870
+
1871
+ let res = client. send_request ( req) . and_then ( move |res| {
1872
+ assert_eq ! ( res. status( ) , hyper:: StatusCode :: OK ) ;
1873
+ res. into_body ( ) . concat2 ( )
1874
+ } ) ;
1875
+ let rx = rx1. expect ( "thread panicked" ) ;
1876
+
1877
+ let timeout = Delay :: new ( Duration :: from_millis ( 200 ) ) ;
1878
+ let rx = rx. and_then ( move |_| timeout. expect ( "timeout" ) ) ;
1879
+ rt. block_on ( res. join ( rx) . map ( |r| r. 0 ) ) . unwrap ( ) ;
1880
+ }
1881
+
1807
1882
#[ test]
1808
1883
fn pipeline ( ) {
1809
1884
let server = TcpListener :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
0 commit comments