@@ -41,21 +41,21 @@ struct HTTP1ConnectionStateMachine {
41
41
}
42
42
43
43
case sendRequestHead( HTTPRequestHead , startBody: Bool )
44
- case sendBodyPart( IOData )
45
- case sendRequestEnd
44
+ case sendBodyPart( IOData , EventLoopPromise < Void > ? )
45
+ case sendRequestEnd( EventLoopPromise < Void > ? )
46
46
47
47
case pauseRequestBodyStream
48
48
case resumeRequestBodyStream
49
49
50
50
case forwardResponseHead( HTTPResponseHead , pauseRequestBodyStream: Bool )
51
51
case forwardResponseBodyParts( CircularBuffer < ByteBuffer > )
52
52
53
- case failRequest( Error , FinalStreamAction )
54
- case succeedRequest( FinalStreamAction , CircularBuffer < ByteBuffer > )
53
+ case failRequest( Error , FinalStreamAction , EventLoopPromise < Void > ? )
54
+ case succeedRequest( FinalStreamAction , CircularBuffer < ByteBuffer > , EventLoopPromise < Void > ? )
55
55
56
56
case read
57
57
case close
58
- case wait
58
+ case wait( EventLoopPromise < Void > ? )
59
59
60
60
case fireChannelActive
61
61
case fireChannelInactive
@@ -80,7 +80,7 @@ struct HTTP1ConnectionStateMachine {
80
80
// Since NIO triggers promise before pipeline, the handler might have been added to the
81
81
// pipeline, before the channelActive callback was triggered. For this reason, we might
82
82
// get the channelActive call twice
83
- return . wait
83
+ return . wait( nil )
84
84
85
85
case . modifying:
86
86
preconditionFailure ( " Invalid state: \( self . state) " )
@@ -104,7 +104,7 @@ struct HTTP1ConnectionStateMachine {
104
104
return . fireChannelInactive
105
105
106
106
case . closed:
107
- return . wait
107
+ return . wait( nil )
108
108
109
109
case . modifying:
110
110
preconditionFailure ( " Invalid state: \( self . state) " )
@@ -141,7 +141,7 @@ struct HTTP1ConnectionStateMachine {
141
141
142
142
switch self . state {
143
143
case . initialized, . idle, . closing, . closed:
144
- return . wait
144
+ return . wait( nil )
145
145
case . inRequest( var requestStateMachine, let close) :
146
146
return self . avoidingStateMachineCoW { state -> Action in
147
147
let action = requestStateMachine. writabilityChanged ( writable: writable)
@@ -173,7 +173,7 @@ struct HTTP1ConnectionStateMachine {
173
173
// as closed.
174
174
//
175
175
// TODO: AHC should support a fast rescheduling mechanism here.
176
- return . failRequest( HTTPClientError . remoteConnectionClosed, . none)
176
+ return . failRequest( HTTPClientError . remoteConnectionClosed, . none, nil )
177
177
178
178
case . idle:
179
179
var requestStateMachine = HTTPRequestStateMachine ( isChannelWritable: self . isChannelWritable)
@@ -189,25 +189,25 @@ struct HTTP1ConnectionStateMachine {
189
189
}
190
190
}
191
191
192
- mutating func requestStreamPartReceived( _ part: IOData ) -> Action {
192
+ mutating func requestStreamPartReceived( _ part: IOData , promise : EventLoopPromise < Void > ? ) -> Action {
193
193
guard case . inRequest( var requestStateMachine, let close) = self . state else {
194
194
preconditionFailure ( " Invalid state: \( self . state) " )
195
195
}
196
196
197
197
return self . avoidingStateMachineCoW { state -> Action in
198
- let action = requestStateMachine. requestStreamPartReceived ( part)
198
+ let action = requestStateMachine. requestStreamPartReceived ( part, promise : promise )
199
199
state = . inRequest( requestStateMachine, close: close)
200
200
return state. modify ( with: action)
201
201
}
202
202
}
203
203
204
- mutating func requestStreamFinished( ) -> Action {
204
+ mutating func requestStreamFinished( promise : EventLoopPromise < Void > ? ) -> Action {
205
205
guard case . inRequest( var requestStateMachine, let close) = self . state else {
206
206
preconditionFailure ( " Invalid state: \( self . state) " )
207
207
}
208
208
209
209
return self . avoidingStateMachineCoW { state -> Action in
210
- let action = requestStateMachine. requestStreamFinished ( )
210
+ let action = requestStateMachine. requestStreamFinished ( promise : promise )
211
211
state = . inRequest( requestStateMachine, close: close)
212
212
return state. modify ( with: action)
213
213
}
@@ -223,7 +223,7 @@ struct HTTP1ConnectionStateMachine {
223
223
self . state = . closing
224
224
return . close
225
225
} else {
226
- return . wait
226
+ return . wait( nil )
227
227
}
228
228
229
229
case . inRequest( var requestStateMachine, close: let close) :
@@ -234,7 +234,7 @@ struct HTTP1ConnectionStateMachine {
234
234
}
235
235
236
236
case . closing, . closed:
237
- return . wait
237
+ return . wait( nil )
238
238
239
239
case . modifying:
240
240
preconditionFailure ( " Invalid state: \( self . state) " )
@@ -284,7 +284,7 @@ struct HTTP1ConnectionStateMachine {
284
284
}
285
285
286
286
case . closing, . closed:
287
- return . wait
287
+ return . wait( nil )
288
288
289
289
case . modifying:
290
290
preconditionFailure ( " Invalid state: \( self . state) " )
@@ -294,7 +294,7 @@ struct HTTP1ConnectionStateMachine {
294
294
mutating func channelReadComplete( ) -> Action {
295
295
switch self . state {
296
296
case . initialized, . idle, . closing, . closed:
297
- return . wait
297
+ return . wait( nil )
298
298
299
299
case . inRequest( var requestStateMachine, let close) :
300
300
return self . avoidingStateMachineCoW { state -> Action in
@@ -377,15 +377,15 @@ extension HTTP1ConnectionStateMachine.State {
377
377
return . pauseRequestBodyStream
378
378
case . resumeRequestBodyStream:
379
379
return . resumeRequestBodyStream
380
- case . sendBodyPart( let part) :
381
- return . sendBodyPart( part)
382
- case . sendRequestEnd:
383
- return . sendRequestEnd
380
+ case . sendBodyPart( let part, let promise ) :
381
+ return . sendBodyPart( part, promise )
382
+ case . sendRequestEnd( let promise ) :
383
+ return . sendRequestEnd( promise )
384
384
case . forwardResponseHead( let head, let pauseRequestBodyStream) :
385
385
return . forwardResponseHead( head, pauseRequestBodyStream: pauseRequestBodyStream)
386
386
case . forwardResponseBodyParts( let parts) :
387
387
return . forwardResponseBodyParts( parts)
388
- case . succeedRequest( let finalAction, let finalParts) :
388
+ case . succeedRequest( let finalAction, let finalParts, let promise ) :
389
389
guard case . inRequest( _, close: let close) = self else {
390
390
preconditionFailure ( " Invalid state: \( self ) " )
391
391
}
@@ -401,9 +401,9 @@ extension HTTP1ConnectionStateMachine.State {
401
401
self = . idle
402
402
newFinalAction = close ? . close : . informConnectionIsIdle
403
403
}
404
- return . succeedRequest( newFinalAction, finalParts)
404
+ return . succeedRequest( newFinalAction, finalParts, promise )
405
405
406
- case . failRequest( let error, let finalAction) :
406
+ case . failRequest( let error, let finalAction, let promise ) :
407
407
switch self {
408
408
case . initialized:
409
409
preconditionFailure ( " Invalid state: \( self ) " )
@@ -412,17 +412,17 @@ extension HTTP1ConnectionStateMachine.State {
412
412
case . inRequest( _, close: let close) :
413
413
if close || finalAction == . close {
414
414
self = . closing
415
- return . failRequest( error, . close)
415
+ return . failRequest( error, . close, promise )
416
416
} else {
417
417
self = . idle
418
- return . failRequest( error, . informConnectionIsIdle)
418
+ return . failRequest( error, . informConnectionIsIdle, promise )
419
419
}
420
420
421
421
case . closing:
422
- return . failRequest( error, . none)
422
+ return . failRequest( error, . none, nil )
423
423
case . closed:
424
424
// this state can be reached, if the connection was unexpectedly closed by remote
425
- return . failRequest( error, . none)
425
+ return . failRequest( error, . none, nil )
426
426
427
427
case . modifying:
428
428
preconditionFailure ( " Invalid state: \( self ) " )
@@ -431,8 +431,8 @@ extension HTTP1ConnectionStateMachine.State {
431
431
case . read:
432
432
return . read
433
433
434
- case . wait:
435
- return . wait
434
+ case . wait( let promise ) :
435
+ return . wait( promise )
436
436
}
437
437
}
438
438
}
0 commit comments