@@ -110,10 +110,23 @@ where
110
110
S :: ResBody ,
111
111
> ,
112
112
> > ,
113
- fallback : bool ,
113
+ fallback : Fallback ,
114
114
}
115
115
116
+ #[ derive( Clone , Debug ) ]
117
+ enum Fallback {
118
+ ToHttp2 ( Exec ) ,
119
+ Http1Only ,
120
+ }
116
121
122
+ impl Fallback {
123
+ fn to_h2 ( & self ) -> bool {
124
+ match * self {
125
+ Fallback :: ToHttp2 ( _) => true ,
126
+ Fallback :: Http1Only => false ,
127
+ }
128
+ }
129
+ }
117
130
118
131
/// Deconstructed parts of a `Connection`.
119
132
///
@@ -305,7 +318,11 @@ impl Http {
305
318
306
319
Connection {
307
320
conn : Some ( either) ,
308
- fallback : self . mode == ConnectionMode :: Fallback ,
321
+ fallback : if self . mode == ConnectionMode :: Fallback {
322
+ Fallback :: ToHttp2 ( self . exec . clone ( ) )
323
+ } else {
324
+ Fallback :: Http1Only
325
+ } ,
309
326
}
310
327
}
311
328
@@ -442,7 +459,7 @@ where
442
459
Err ( e) => {
443
460
debug ! ( "error polling connection protocol without shutdown: {}" , e) ;
444
461
match * e. kind ( ) {
445
- Kind :: Parse ( Parse :: VersionH2 ) if self . fallback => {
462
+ Kind :: Parse ( Parse :: VersionH2 ) if self . fallback . to_h2 ( ) => {
446
463
self . upgrade_h2 ( ) ;
447
464
continue ;
448
465
}
@@ -467,7 +484,11 @@ where
467
484
} ;
468
485
let mut rewind_io = Rewind :: new ( io) ;
469
486
rewind_io. rewind ( read_buf) ;
470
- let h2 = proto:: h2:: Server :: new ( rewind_io, dispatch. into_service ( ) , Exec :: Default ) ;
487
+ let exec = match self . fallback {
488
+ Fallback :: ToHttp2 ( ref exec) => exec. clone ( ) ,
489
+ Fallback :: Http1Only => unreachable ! ( "upgrade_h2 with Fallback::Http1Only" ) ,
490
+ } ;
491
+ let h2 = proto:: h2:: Server :: new ( rewind_io, dispatch. into_service ( ) , exec) ;
471
492
472
493
debug_assert ! ( self . conn. is_none( ) ) ;
473
494
self . conn = Some ( Either :: B ( h2) ) ;
@@ -512,7 +533,7 @@ where
512
533
Err ( e) => {
513
534
debug ! ( "error polling connection protocol: {}" , e) ;
514
535
match * e. kind ( ) {
515
- Kind :: Parse ( Parse :: VersionH2 ) if self . fallback => {
536
+ Kind :: Parse ( Parse :: VersionH2 ) if self . fallback . to_h2 ( ) => {
516
537
self . upgrade_h2 ( ) ;
517
538
continue ;
518
539
}
@@ -717,7 +738,7 @@ mod upgrades {
717
738
Err ( e) => {
718
739
debug ! ( "error polling connection protocol: {}" , e) ;
719
740
match * e. kind ( ) {
720
- Kind :: Parse ( Parse :: VersionH2 ) if self . inner . fallback => {
741
+ Kind :: Parse ( Parse :: VersionH2 ) if self . inner . fallback . to_h2 ( ) => {
721
742
self . inner . upgrade_h2 ( ) ;
722
743
continue ;
723
744
}
0 commit comments