@@ -168,7 +168,7 @@ extension HTTP2IdleHandler {
168
168
169
169
mutating func settingsReceived( _ settings: HTTP2Settings ) -> Action {
170
170
switch self . state {
171
- case . initialized, . closed :
171
+ case . initialized:
172
172
preconditionFailure ( " Invalid state: \( self . state) " )
173
173
174
174
case . connected:
@@ -188,12 +188,17 @@ extension HTTP2IdleHandler {
188
188
189
189
case . closing:
190
190
return . nothing
191
+
192
+ case . closed:
193
+ // We may receive a Settings frame after we have called connection close, because of
194
+ // packages being delivered from the incoming buffer.
195
+ return . nothing
191
196
}
192
197
}
193
198
194
199
mutating func goAwayReceived( ) -> Action {
195
200
switch self . state {
196
- case . initialized, . closed :
201
+ case . initialized:
197
202
preconditionFailure ( " Invalid state: \( self . state) " )
198
203
199
204
case . connected:
@@ -206,6 +211,11 @@ extension HTTP2IdleHandler {
206
211
207
212
case . closing:
208
213
return . notifyConnectionGoAwayReceived( close: false )
214
+
215
+ case . closed:
216
+ // We may receive a GoAway frame after we have called connection close, because of
217
+ // packages being delivered from the incoming buffer.
218
+ return . nothing
209
219
}
210
220
}
211
221
@@ -234,6 +244,9 @@ extension HTTP2IdleHandler {
234
244
235
245
mutating func streamCreated( ) -> Action {
236
246
switch self . state {
247
+ case . initialized, . connected:
248
+ preconditionFailure ( " Invalid state: \( self . state) " )
249
+
237
250
case . active( var openStreams, let maxStreams) :
238
251
openStreams += 1
239
252
self . state = . active( openStreams: openStreams, maxStreams: maxStreams)
@@ -246,13 +259,18 @@ extension HTTP2IdleHandler {
246
259
self . state = . closing( openStreams: openStreams, maxStreams: maxStreams)
247
260
return . nothing
248
261
249
- case . initialized, . connected, . closed:
250
- preconditionFailure ( " Invalid state: \( self . state) " )
262
+ case . closed:
263
+ // We may receive a events after we have called connection close, because of
264
+ // internal races. We should just ignore these cases.
265
+ return . nothing
251
266
}
252
267
}
253
268
254
269
mutating func streamClosed( ) -> Action {
255
270
switch self . state {
271
+ case . initialized, . connected:
272
+ preconditionFailure ( " Invalid state: \( self . state) " )
273
+
256
274
case . active( var openStreams, let maxStreams) :
257
275
openStreams -= 1
258
276
assert ( openStreams >= 0 )
@@ -269,8 +287,10 @@ extension HTTP2IdleHandler {
269
287
self . state = . closing( openStreams: openStreams, maxStreams: maxStreams)
270
288
return . nothing
271
289
272
- case . initialized, . connected, . closed:
273
- preconditionFailure ( " Invalid state: \( self . state) " )
290
+ case . closed:
291
+ // We may receive a events after we have called connection close, because of
292
+ // internal races. We should just ignore these cases.
293
+ return . nothing
274
294
}
275
295
}
276
296
}
0 commit comments