@@ -10,6 +10,7 @@ use crate::common::{task, Future, Pin, Poll, Unpin};
1010use crate :: proto:: {
1111 BodyLength , Conn , Dispatched , MessageHead , RequestHead ,
1212} ;
13+ use crate :: upgrade:: OnUpgrade ;
1314
1415pub ( crate ) struct Dispatcher < D , Bs : HttpBody , I , T > {
1516 conn : Conn < I , Bs :: Data , T > ,
@@ -243,8 +244,8 @@ where
243244 }
244245 // dispatch is ready for a message, try to read one
245246 match ready ! ( self . conn. poll_read_head( cx) ) {
246- Some ( Ok ( ( head, body_len, wants) ) ) => {
247- let mut body = match body_len {
247+ Some ( Ok ( ( mut head, body_len, wants) ) ) => {
248+ let body = match body_len {
248249 DecodedLength :: ZERO => Body :: empty ( ) ,
249250 other => {
250251 let ( tx, rx) = Body :: new_channel ( other, wants. contains ( Wants :: EXPECT ) ) ;
@@ -253,7 +254,10 @@ where
253254 }
254255 } ;
255256 if wants. contains ( Wants :: UPGRADE ) {
256- body. set_on_upgrade ( self . conn . on_upgrade ( ) ) ;
257+ let upgrade = self . conn . on_upgrade ( ) ;
258+ debug_assert ! ( !upgrade. is_none( ) , "empty upgrade" ) ;
259+ debug_assert ! ( head. extensions. get:: <OnUpgrade >( ) . is_none( ) , "OnUpgrade already set" ) ;
260+ head. extensions . insert ( upgrade) ;
257261 }
258262 self . dispatch . recv_msg ( Ok ( ( head, body) ) ) ?;
259263 Poll :: Ready ( Ok ( ( ) ) )
@@ -488,6 +492,7 @@ cfg_server! {
488492 version: parts. version,
489493 subject: parts. status,
490494 headers: parts. headers,
495+ extensions: http:: Extensions :: default ( ) ,
491496 } ;
492497 Poll :: Ready ( Some ( Ok ( ( head, body) ) ) )
493498 } else {
@@ -506,6 +511,7 @@ cfg_server! {
506511 * req. uri_mut( ) = msg. subject. 1 ;
507512 * req. headers_mut( ) = msg. headers;
508513 * req. version_mut( ) = msg. version;
514+ * req. extensions_mut( ) = msg. extensions;
509515 let fut = self . service. call( req) ;
510516 self . in_flight. set( Some ( fut) ) ;
511517 Ok ( ( ) )
@@ -570,6 +576,7 @@ cfg_client! {
570576 version: parts. version,
571577 subject: crate :: proto:: RequestLine ( parts. method, parts. uri) ,
572578 headers: parts. headers,
579+ extensions: http:: Extensions :: default ( ) ,
573580 } ;
574581 * this. callback = Some ( cb) ;
575582 Poll :: Ready ( Some ( Ok ( ( head, body) ) ) )
@@ -594,6 +601,7 @@ cfg_client! {
594601 * res. status_mut( ) = msg. subject;
595602 * res. headers_mut( ) = msg. headers;
596603 * res. version_mut( ) = msg. version;
604+ * res. extensions_mut( ) = msg. extensions;
597605 cb. send( Ok ( res) ) ;
598606 Ok ( ( ) )
599607 } else {
0 commit comments