@@ -15,6 +15,7 @@ use super::{ping, PipeToSendStream, SendBuf};
1515use crate :: body:: HttpBody ;
1616use crate :: common:: exec:: ConnStreamExec ;
1717use crate :: common:: { date, task, Future , Pin , Poll } ;
18+ use crate :: ext:: Protocol ;
1819use crate :: headers;
1920use crate :: proto:: h2:: ping:: Recorder ;
2021use crate :: proto:: h2:: { H2Upgraded , UpgradedSendStream } ;
@@ -41,6 +42,7 @@ pub(crate) struct Config {
4142 pub ( crate ) initial_conn_window_size : u32 ,
4243 pub ( crate ) initial_stream_window_size : u32 ,
4344 pub ( crate ) max_frame_size : u32 ,
45+ pub ( crate ) enable_connect_protocol : bool ,
4446 pub ( crate ) max_concurrent_streams : Option < u32 > ,
4547 #[ cfg( feature = "runtime" ) ]
4648 pub ( crate ) keep_alive_interval : Option < Duration > ,
@@ -56,6 +58,7 @@ impl Default for Config {
5658 initial_conn_window_size : DEFAULT_CONN_WINDOW ,
5759 initial_stream_window_size : DEFAULT_STREAM_WINDOW ,
5860 max_frame_size : DEFAULT_MAX_FRAME_SIZE ,
61+ enable_connect_protocol : false ,
5962 max_concurrent_streams : None ,
6063 #[ cfg( feature = "runtime" ) ]
6164 keep_alive_interval : None ,
@@ -117,6 +120,9 @@ where
117120 if let Some ( max) = config. max_concurrent_streams {
118121 builder. max_concurrent_streams ( max) ;
119122 }
123+ if config. enable_connect_protocol {
124+ builder. enable_connect_protocol ( ) ;
125+ }
120126 let handshake = builder. handshake ( io) ;
121127
122128 let bdp = if config. adaptive_window {
@@ -280,7 +286,7 @@ where
280286
281287 let is_connect = req. method ( ) == Method :: CONNECT ;
282288 let ( mut parts, stream) = req. into_parts ( ) ;
283- let ( req, connect_parts) = if !is_connect {
289+ let ( mut req, connect_parts) = if !is_connect {
284290 (
285291 Request :: from_parts (
286292 parts,
@@ -307,6 +313,10 @@ where
307313 )
308314 } ;
309315
316+ if let Some ( protocol) = req. extensions_mut ( ) . remove :: < h2:: ext:: Protocol > ( ) {
317+ req. extensions_mut ( ) . insert ( Protocol :: from_inner ( protocol) ) ;
318+ }
319+
310320 let fut = H2Stream :: new ( service. call ( req) , connect_parts, respond) ;
311321 exec. execute_h2stream ( fut) ;
312322 }
0 commit comments