@@ -13,14 +13,16 @@ use hyper::{Body, Client, Request, Response, Server, Version};
13
13
pub use futures_util:: {
14
14
future, FutureExt as _, StreamExt as _, TryFutureExt as _, TryStreamExt as _,
15
15
} ;
16
- pub use hyper:: { HeaderMap , StatusCode } ;
16
+ pub use hyper:: { ext :: Protocol , http :: Extensions , HeaderMap , StatusCode } ;
17
17
pub use std:: net:: SocketAddr ;
18
18
19
19
#[ allow( unused_macros) ]
20
20
macro_rules! t {
21
21
(
22
+ @impl
22
23
$name: ident,
23
- parallel: $range: expr
24
+ parallel: $range: expr,
25
+ $( h2_only: $_h2_only: expr) ?
24
26
) => (
25
27
#[ test]
26
28
fn $name( ) {
@@ -75,6 +77,7 @@ macro_rules! t {
75
77
}
76
78
) ;
77
79
(
80
+ @impl
78
81
$name: ident,
79
82
client: $(
80
83
request: $(
@@ -91,7 +94,8 @@ macro_rules! t {
91
94
response: $(
92
95
$s_res_prop: ident: $s_res_val: tt,
93
96
) * ;
94
- ) *
97
+ ) * ,
98
+ h2_only: $h2_only: expr
95
99
) => (
96
100
#[ test]
97
101
fn $name( ) {
@@ -116,15 +120,17 @@ macro_rules! t {
116
120
}
117
121
) , ) * ] ;
118
122
119
- __run_test( __TestConfig {
120
- client_version: 1 ,
121
- client_msgs: c. clone( ) ,
122
- server_version: 1 ,
123
- server_msgs: s. clone( ) ,
124
- parallel: false ,
125
- connections: 1 ,
126
- proxy: false ,
127
- } ) ;
123
+ if !$h2_only {
124
+ __run_test( __TestConfig {
125
+ client_version: 1 ,
126
+ client_msgs: c. clone( ) ,
127
+ server_version: 1 ,
128
+ server_msgs: s. clone( ) ,
129
+ parallel: false ,
130
+ connections: 1 ,
131
+ proxy: false ,
132
+ } ) ;
133
+ }
128
134
129
135
__run_test( __TestConfig {
130
136
client_version: 2 ,
@@ -136,15 +142,17 @@ macro_rules! t {
136
142
proxy: false ,
137
143
} ) ;
138
144
139
- __run_test( __TestConfig {
140
- client_version: 1 ,
141
- client_msgs: c. clone( ) ,
142
- server_version: 1 ,
143
- server_msgs: s. clone( ) ,
144
- parallel: false ,
145
- connections: 1 ,
146
- proxy: true ,
147
- } ) ;
145
+ if !$h2_only {
146
+ __run_test( __TestConfig {
147
+ client_version: 1 ,
148
+ client_msgs: c. clone( ) ,
149
+ server_version: 1 ,
150
+ server_msgs: s. clone( ) ,
151
+ parallel: false ,
152
+ connections: 1 ,
153
+ proxy: true ,
154
+ } ) ;
155
+ }
148
156
149
157
__run_test( __TestConfig {
150
158
client_version: 2 ,
@@ -157,6 +165,12 @@ macro_rules! t {
157
165
} ) ;
158
166
}
159
167
) ;
168
+ ( h2_only; $( $t: tt) * ) => {
169
+ t!( @impl $( $t) * , h2_only: true ) ;
170
+ } ;
171
+ ( $( $t: tt) * ) => {
172
+ t!( @impl $( $t) * , h2_only: false ) ;
173
+ } ;
160
174
}
161
175
162
176
macro_rules! __internal_map_prop {
@@ -245,6 +259,7 @@ pub struct __CReq {
245
259
pub uri : & ' static str ,
246
260
pub headers : HeaderMap ,
247
261
pub body : Vec < u8 > ,
262
+ pub protocol : Option < & ' static str > ,
248
263
}
249
264
250
265
impl Default for __CReq {
@@ -254,6 +269,7 @@ impl Default for __CReq {
254
269
uri : "/" ,
255
270
headers : HeaderMap :: new ( ) ,
256
271
body : Vec :: new ( ) ,
272
+ protocol : None ,
257
273
}
258
274
}
259
275
}
@@ -371,6 +387,7 @@ async fn async_test(cfg: __TestConfig) {
371
387
372
388
let server = hyper:: Server :: bind ( & SocketAddr :: from ( ( [ 127 , 0 , 0 , 1 ] , 0 ) ) )
373
389
. http2_only ( cfg. server_version == 2 )
390
+ . http2_enable_connect_protocol ( )
374
391
. serve ( new_service) ;
375
392
376
393
let mut addr = server. local_addr ( ) ;
@@ -398,6 +415,9 @@ async fn async_test(cfg: __TestConfig) {
398
415
//.headers(creq.headers)
399
416
. body ( creq. body . into ( ) )
400
417
. expect ( "Request::build" ) ;
418
+ if let Some ( protocol) = creq. protocol {
419
+ req. extensions_mut ( ) . insert ( Protocol :: from_static ( protocol) ) ;
420
+ }
401
421
* req. headers_mut ( ) = creq. headers ;
402
422
let cstatus = cres. status ;
403
423
let cheaders = cres. headers ;
@@ -458,18 +478,20 @@ fn naive_proxy(cfg: ProxyConfig) -> (SocketAddr, impl Future<Output = ()>) {
458
478
let max_connections = cfg. connections ;
459
479
let counter = AtomicUsize :: new ( 0 ) ;
460
480
461
- let srv = Server :: bind ( & ( [ 127 , 0 , 0 , 1 ] , 0 ) . into ( ) ) . serve ( make_service_fn ( move |_| {
462
- let prev = counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
463
- assert ! ( max_connections > prev, "proxy max connections" ) ;
464
- let client = client. clone ( ) ;
465
- future:: ok :: < _ , hyper:: Error > ( service_fn ( move |mut req| {
466
- let uri = format ! ( "http://{}{}" , dst_addr, req. uri( ) . path( ) )
467
- . parse ( )
468
- . expect ( "proxy new uri parse" ) ;
469
- * req. uri_mut ( ) = uri;
470
- client. request ( req)
471
- } ) )
472
- } ) ) ;
481
+ let srv = Server :: bind ( & ( [ 127 , 0 , 0 , 1 ] , 0 ) . into ( ) )
482
+ . http2_enable_connect_protocol ( )
483
+ . serve ( make_service_fn ( move |_| {
484
+ let prev = counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
485
+ assert ! ( max_connections > prev, "proxy max connections" ) ;
486
+ let client = client. clone ( ) ;
487
+ future:: ok :: < _ , hyper:: Error > ( service_fn ( move |mut req| {
488
+ let uri = format ! ( "http://{}{}" , dst_addr, req. uri( ) . path( ) )
489
+ . parse ( )
490
+ . expect ( "proxy new uri parse" ) ;
491
+ * req. uri_mut ( ) = uri;
492
+ client. request ( req)
493
+ } ) )
494
+ } ) ) ;
473
495
let proxy_addr = srv. local_addr ( ) ;
474
496
( proxy_addr, srv. map ( |res| res. expect ( "proxy error" ) ) )
475
497
}
0 commit comments