@@ -89,6 +89,7 @@ pin_project! {
89
89
service: S ,
90
90
state: State <T , B >,
91
91
date_header: bool ,
92
+ close_pending: bool
92
93
}
93
94
}
94
95
@@ -101,7 +102,6 @@ where
101
102
hs : Handshake < Compat < T > , SendBuf < B :: Data > > ,
102
103
} ,
103
104
Serving ( Serving < T , B > ) ,
104
- Closed ,
105
105
}
106
106
107
107
struct Serving < T , B >
@@ -172,26 +172,24 @@ where
172
172
} ,
173
173
service,
174
174
date_header : config. date_header ,
175
+ close_pending : false
175
176
}
176
177
}
177
178
178
179
pub ( crate ) fn graceful_shutdown ( & mut self ) {
179
180
trace ! ( "graceful_shutdown" ) ;
180
181
match self . state {
181
182
State :: Handshaking { .. } => {
182
- // fall-through, to replace state with Closed
183
+ self . close_pending = true ;
184
+ return ;
183
185
}
184
186
State :: Serving ( ref mut srv) => {
185
187
if srv. closing . is_none ( ) {
186
188
srv. conn . graceful_shutdown ( ) ;
187
189
}
188
190
return ;
189
191
}
190
- State :: Closed => {
191
- return ;
192
- }
193
192
}
194
- self . state = State :: Closed ;
195
193
}
196
194
}
197
195
@@ -228,12 +226,12 @@ where
228
226
} )
229
227
}
230
228
State :: Serving ( ref mut srv) => {
231
- ready ! ( srv. poll_server( cx, & mut me. service, & mut me. exec) ) ?;
232
- return Poll :: Ready ( Ok ( Dispatched :: Shutdown ) ) ;
233
- }
234
- State :: Closed => {
229
+
235
230
// graceful_shutdown was called before handshaking finished,
236
- // nothing to do here...
231
+ if true == me. close_pending && srv. closing . is_none ( ) {
232
+ srv. conn . graceful_shutdown ( ) ;
233
+ }
234
+ ready ! ( srv. poll_server( cx, & mut me. service, & mut me. exec) ) ?;
237
235
return Poll :: Ready ( Ok ( Dispatched :: Shutdown ) ) ;
238
236
}
239
237
} ;
0 commit comments