81
81
//! [`Connection`]: Connection
82
82
use std:: fmt;
83
83
84
- use :: http:: Response ;
84
+ use :: http:: Extensions ;
85
85
86
86
#[ cfg( feature = "tcp" ) ]
87
87
pub mod dns;
@@ -149,6 +149,11 @@ impl Connected {
149
149
self
150
150
}
151
151
152
+ /// Determines if the connected transport is to an HTTP proxy.
153
+ pub fn is_proxied ( & self ) -> bool {
154
+ self . is_proxied
155
+ }
156
+
152
157
/// Set extra connection information to be set in the extensions of every `Response`.
153
158
pub fn extra < T : Clone + Send + Sync + ' static > ( mut self , extra : T ) -> Connected {
154
159
if let Some ( prev) = self . extra {
@@ -159,13 +164,24 @@ impl Connected {
159
164
self
160
165
}
161
166
162
- /// Set that the connected transport negotiated HTTP/2 as it's
163
- /// next protocol.
167
+ /// Copies the extra connection information into an `Extensions` map.
168
+ pub fn get_extras ( & self , extensions : & mut Extensions ) {
169
+ if let Some ( extra) = & self . extra {
170
+ extra. set ( extensions) ;
171
+ }
172
+ }
173
+
174
+ /// Set that the connected transport negotiated HTTP/2 as its next protocol.
164
175
pub fn negotiated_h2 ( mut self ) -> Connected {
165
176
self . alpn = Alpn :: H2 ;
166
177
self
167
178
}
168
179
180
+ /// Determines if the connected transport negotiated HTTP/2 as its next protocol.
181
+ pub fn is_negotiated_h2 ( & self ) -> bool {
182
+ self . alpn == Alpn :: H2
183
+ }
184
+
169
185
// Don't public expose that `Connected` is `Clone`, unsure if we want to
170
186
// keep that contract...
171
187
pub ( super ) fn clone ( & self ) -> Connected {
@@ -180,7 +196,7 @@ impl Connected {
180
196
// ===== impl Extra =====
181
197
182
198
impl Extra {
183
- pub ( super ) fn set ( & self , res : & mut Response < crate :: Body > ) {
199
+ pub ( super ) fn set ( & self , res : & mut Extensions ) {
184
200
self . 0 . set ( res) ;
185
201
}
186
202
}
@@ -199,7 +215,7 @@ impl fmt::Debug for Extra {
199
215
200
216
trait ExtraInner : Send + Sync {
201
217
fn clone_box ( & self ) -> Box < dyn ExtraInner > ;
202
- fn set ( & self , res : & mut Response < crate :: Body > ) ;
218
+ fn set ( & self , res : & mut Extensions ) ;
203
219
}
204
220
205
221
// This indirection allows the `Connected` to have a type-erased "extra" value,
@@ -216,8 +232,8 @@ where
216
232
Box :: new ( self . clone ( ) )
217
233
}
218
234
219
- fn set ( & self , res : & mut Response < crate :: Body > ) {
220
- res. extensions_mut ( ) . insert ( self . 0 . clone ( ) ) ;
235
+ fn set ( & self , res : & mut Extensions ) {
236
+ res. insert ( self . 0 . clone ( ) ) ;
221
237
}
222
238
}
223
239
@@ -237,9 +253,9 @@ where
237
253
Box :: new ( self . clone ( ) )
238
254
}
239
255
240
- fn set ( & self , res : & mut Response < crate :: Body > ) {
256
+ fn set ( & self , res : & mut Extensions ) {
241
257
self . 0 . set ( res) ;
242
- res. extensions_mut ( ) . insert ( self . 1 . clone ( ) ) ;
258
+ res. insert ( self . 1 . clone ( ) ) ;
243
259
}
244
260
}
245
261
@@ -340,13 +356,13 @@ mod tests {
340
356
fn test_connected_extra ( ) {
341
357
let c1 = Connected :: new ( ) . extra ( Ex1 ( 41 ) ) ;
342
358
343
- let mut res1 = crate :: Response :: new ( crate :: Body :: empty ( ) ) ;
359
+ let mut ex = :: http :: Extensions :: new ( ) ;
344
360
345
- assert_eq ! ( res1 . extensions ( ) . get:: <Ex1 >( ) , None ) ;
361
+ assert_eq ! ( ex . get:: <Ex1 >( ) , None ) ;
346
362
347
- c1. extra . as_ref ( ) . expect ( "c1 extra" ) . set ( & mut res1 ) ;
363
+ c1. extra . as_ref ( ) . expect ( "c1 extra" ) . set ( & mut ex ) ;
348
364
349
- assert_eq ! ( res1 . extensions ( ) . get:: <Ex1 >( ) , Some ( & Ex1 ( 41 ) ) ) ;
365
+ assert_eq ! ( ex . get:: <Ex1 >( ) , Some ( & Ex1 ( 41 ) ) ) ;
350
366
}
351
367
352
368
#[ test]
@@ -359,29 +375,29 @@ mod tests {
359
375
. extra ( Ex2 ( "zoom" ) )
360
376
. extra ( Ex3 ( "pew pew" ) ) ;
361
377
362
- let mut res1 = crate :: Response :: new ( crate :: Body :: empty ( ) ) ;
378
+ let mut ex1 = :: http :: Extensions :: new ( ) ;
363
379
364
- assert_eq ! ( res1 . extensions ( ) . get:: <Ex1 >( ) , None ) ;
365
- assert_eq ! ( res1 . extensions ( ) . get:: <Ex2 >( ) , None ) ;
366
- assert_eq ! ( res1 . extensions ( ) . get:: <Ex3 >( ) , None ) ;
380
+ assert_eq ! ( ex1 . get:: <Ex1 >( ) , None ) ;
381
+ assert_eq ! ( ex1 . get:: <Ex2 >( ) , None ) ;
382
+ assert_eq ! ( ex1 . get:: <Ex3 >( ) , None ) ;
367
383
368
- c1. extra . as_ref ( ) . expect ( "c1 extra" ) . set ( & mut res1 ) ;
384
+ c1. extra . as_ref ( ) . expect ( "c1 extra" ) . set ( & mut ex1 ) ;
369
385
370
- assert_eq ! ( res1 . extensions ( ) . get:: <Ex1 >( ) , Some ( & Ex1 ( 45 ) ) ) ;
371
- assert_eq ! ( res1 . extensions ( ) . get:: <Ex2 >( ) , Some ( & Ex2 ( "zoom" ) ) ) ;
372
- assert_eq ! ( res1 . extensions ( ) . get:: <Ex3 >( ) , Some ( & Ex3 ( "pew pew" ) ) ) ;
386
+ assert_eq ! ( ex1 . get:: <Ex1 >( ) , Some ( & Ex1 ( 45 ) ) ) ;
387
+ assert_eq ! ( ex1 . get:: <Ex2 >( ) , Some ( & Ex2 ( "zoom" ) ) ) ;
388
+ assert_eq ! ( ex1 . get:: <Ex3 >( ) , Some ( & Ex3 ( "pew pew" ) ) ) ;
373
389
374
390
// Just like extensions, inserting the same type overrides previous type.
375
391
let c2 = Connected :: new ( )
376
392
. extra ( Ex1 ( 33 ) )
377
393
. extra ( Ex2 ( "hiccup" ) )
378
394
. extra ( Ex1 ( 99 ) ) ;
379
395
380
- let mut res2 = crate :: Response :: new ( crate :: Body :: empty ( ) ) ;
396
+ let mut ex2 = :: http :: Extensions :: new ( ) ;
381
397
382
- c2. extra . as_ref ( ) . expect ( "c2 extra" ) . set ( & mut res2 ) ;
398
+ c2. extra . as_ref ( ) . expect ( "c2 extra" ) . set ( & mut ex2 ) ;
383
399
384
- assert_eq ! ( res2 . extensions ( ) . get:: <Ex1 >( ) , Some ( & Ex1 ( 99 ) ) ) ;
385
- assert_eq ! ( res2 . extensions ( ) . get:: <Ex2 >( ) , Some ( & Ex2 ( "hiccup" ) ) ) ;
400
+ assert_eq ! ( ex2 . get:: <Ex1 >( ) , Some ( & Ex1 ( 99 ) ) ) ;
401
+ assert_eq ! ( ex2 . get:: <Ex2 >( ) , Some ( & Ex2 ( "hiccup" ) ) ) ;
386
402
}
387
403
}
0 commit comments