@@ -57,18 +57,16 @@ pub struct Parts<T> {
57
57
_inner : ( ) ,
58
58
}
59
59
60
+ /// Gets a pending HTTP upgrade from this message.
61
+ pub fn on < T : sealed:: CanUpgrade > ( msg : T ) -> OnUpgrade {
62
+ msg. on_upgrade ( )
63
+ }
64
+
60
65
#[ cfg( feature = "http1" ) ]
61
66
pub ( crate ) struct Pending {
62
67
tx : oneshot:: Sender < crate :: Result < Upgraded > > ,
63
68
}
64
69
65
- /// Error cause returned when an upgrade was expected but canceled
66
- /// for whatever reason.
67
- ///
68
- /// This likely means the actual `Conn` future wasn't polled and upgraded.
69
- #[ derive( Debug ) ]
70
- struct UpgradeExpected ( ( ) ) ;
71
-
72
70
#[ cfg( feature = "http1" ) ]
73
71
pub ( crate ) fn pending ( ) -> ( Pending , OnUpgrade ) {
74
72
let ( tx, rx) = oneshot:: channel ( ) ;
@@ -162,9 +160,7 @@ impl Future for OnUpgrade {
162
160
Some ( ref mut rx) => Pin :: new ( rx) . poll ( cx) . map ( |res| match res {
163
161
Ok ( Ok ( upgraded) ) => Ok ( upgraded) ,
164
162
Ok ( Err ( err) ) => Err ( err) ,
165
- Err ( _oneshot_canceled) => {
166
- Err ( crate :: Error :: new_canceled ( ) . with ( UpgradeExpected ( ( ) ) ) )
167
- }
163
+ Err ( _oneshot_canceled) => Err ( crate :: Error :: new_canceled ( ) . with ( UpgradeExpected ) ) ,
168
164
} ) ,
169
165
None => Poll :: Ready ( Err ( crate :: Error :: new_user_no_upgrade ( ) ) ) ,
170
166
}
@@ -196,9 +192,16 @@ impl Pending {
196
192
197
193
// ===== impl UpgradeExpected =====
198
194
195
+ /// Error cause returned when an upgrade was expected but canceled
196
+ /// for whatever reason.
197
+ ///
198
+ /// This likely means the actual `Conn` future wasn't polled and upgraded.
199
+ #[ derive( Debug ) ]
200
+ struct UpgradeExpected ;
201
+
199
202
impl fmt:: Display for UpgradeExpected {
200
203
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
201
- write ! ( f , "upgrade expected but not completed" )
204
+ f . write_str ( "upgrade expected but not completed" )
202
205
}
203
206
}
204
207
@@ -277,6 +280,38 @@ impl<T: AsyncRead + AsyncWrite + Unpin + 'static> Io for ForwardsWriteBuf<T> {
277
280
}
278
281
}
279
282
283
+ mod sealed {
284
+ use super :: OnUpgrade ;
285
+
286
+ pub trait CanUpgrade {
287
+ fn on_upgrade ( self ) -> OnUpgrade ;
288
+ }
289
+
290
+ impl CanUpgrade for http:: Request < crate :: Body > {
291
+ fn on_upgrade ( self ) -> OnUpgrade {
292
+ self . into_body ( ) . take_upgrade ( )
293
+ }
294
+ }
295
+
296
+ impl CanUpgrade for & ' _ mut http:: Request < crate :: Body > {
297
+ fn on_upgrade ( self ) -> OnUpgrade {
298
+ self . body_mut ( ) . take_upgrade ( )
299
+ }
300
+ }
301
+
302
+ impl CanUpgrade for http:: Response < crate :: Body > {
303
+ fn on_upgrade ( self ) -> OnUpgrade {
304
+ self . into_body ( ) . take_upgrade ( )
305
+ }
306
+ }
307
+
308
+ impl CanUpgrade for & ' _ mut http:: Response < crate :: Body > {
309
+ fn on_upgrade ( self ) -> OnUpgrade {
310
+ self . body_mut ( ) . take_upgrade ( )
311
+ }
312
+ }
313
+ }
314
+
280
315
#[ cfg( test) ]
281
316
mod tests {
282
317
use super :: * ;
0 commit comments