@@ -168,7 +168,7 @@ extension HTTP2IdleHandler {
168168
169169 mutating func settingsReceived( _ settings: HTTP2Settings ) -> Action {
170170 switch self . state {
171- case . initialized, . closed :
171+ case . initialized:
172172 preconditionFailure ( " Invalid state: \( self . state) " )
173173
174174 case . connected:
@@ -188,12 +188,17 @@ extension HTTP2IdleHandler {
188188
189189 case . closing:
190190 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
191196 }
192197 }
193198
194199 mutating func goAwayReceived( ) -> Action {
195200 switch self . state {
196- case . initialized, . closed :
201+ case . initialized:
197202 preconditionFailure ( " Invalid state: \( self . state) " )
198203
199204 case . connected:
@@ -206,6 +211,11 @@ extension HTTP2IdleHandler {
206211
207212 case . closing:
208213 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
209219 }
210220 }
211221
@@ -234,6 +244,9 @@ extension HTTP2IdleHandler {
234244
235245 mutating func streamCreated( ) -> Action {
236246 switch self . state {
247+ case . initialized, . connected:
248+ preconditionFailure ( " Invalid state: \( self . state) " )
249+
237250 case . active( var openStreams, let maxStreams) :
238251 openStreams += 1
239252 self . state = . active( openStreams: openStreams, maxStreams: maxStreams)
@@ -246,13 +259,18 @@ extension HTTP2IdleHandler {
246259 self . state = . closing( openStreams: openStreams, maxStreams: maxStreams)
247260 return . nothing
248261
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
251266 }
252267 }
253268
254269 mutating func streamClosed( ) -> Action {
255270 switch self . state {
271+ case . initialized, . connected:
272+ preconditionFailure ( " Invalid state: \( self . state) " )
273+
256274 case . active( var openStreams, let maxStreams) :
257275 openStreams -= 1
258276 assert ( openStreams >= 0 )
@@ -269,8 +287,10 @@ extension HTTP2IdleHandler {
269287 self . state = . closing( openStreams: openStreams, maxStreams: maxStreams)
270288 return . nothing
271289
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
274294 }
275295 }
276296 }
0 commit comments