@@ -83,8 +83,8 @@ struct HTTPRequestStateMachine {
83
83
}
84
84
85
85
case sendRequestHead( HTTPRequestHead , startBody: Bool )
86
- case sendBodyPart( IOData )
87
- case sendRequestEnd
86
+ case sendBodyPart( IOData , EventLoopPromise < Void > ? )
87
+ case sendRequestEnd( EventLoopPromise < Void > ? )
88
88
89
89
case pauseRequestBodyStream
90
90
case resumeRequestBodyStream
@@ -261,7 +261,7 @@ struct HTTPRequestStateMachine {
261
261
}
262
262
}
263
263
264
- mutating func requestStreamPartReceived( _ part: IOData ) -> Action {
264
+ mutating func requestStreamPartReceived( _ part: IOData , promise : EventLoopPromise < Void > ? ) -> Action {
265
265
switch self . state {
266
266
case . initialized,
267
267
. waitForChannelToBecomeWritable,
@@ -274,6 +274,7 @@ struct HTTPRequestStateMachine {
274
274
// won't be interested. We expect that the producer has been informed to pause
275
275
// producing.
276
276
assert ( producerState == . paused)
277
+ promise? . fail ( HTTPClientError . requestStreamCancelled)
277
278
return . wait
278
279
279
280
case . running( . streaming( let expectedBodyLength, var sentBodyBytes, let producerState) , let responseState) :
@@ -290,6 +291,7 @@ struct HTTPRequestStateMachine {
290
291
if let expected = expectedBodyLength, sentBodyBytes + part. readableBytes > expected {
291
292
let error = HTTPClientError . bodyLengthMismatch
292
293
self . state = . failed( error)
294
+ promise? . fail ( error)
293
295
return . failRequest( error, . close)
294
296
}
295
297
@@ -303,9 +305,10 @@ struct HTTPRequestStateMachine {
303
305
304
306
self . state = . running( requestState, responseState)
305
307
306
- return . sendBodyPart( part)
308
+ return . sendBodyPart( part, promise )
307
309
308
310
case . failed:
311
+ promise? . fail ( HTTPClientError . failed)
309
312
return . wait
310
313
311
314
case . finished:
@@ -318,14 +321,15 @@ struct HTTPRequestStateMachine {
318
321
319
322
// We may still receive something, here because of potential race conditions with the
320
323
// producing thread.
324
+ promise? . fail ( ChannelError . eof)
321
325
return . wait
322
326
323
327
case . modifying:
324
328
preconditionFailure ( " Invalid state: \( self . state) " )
325
329
}
326
330
}
327
331
328
- mutating func requestStreamFinished( ) -> Action {
332
+ mutating func requestStreamFinished( promise : EventLoopPromise < Void > ? ) -> Action {
329
333
switch self . state {
330
334
case . initialized,
331
335
. waitForChannelToBecomeWritable,
@@ -336,35 +340,40 @@ struct HTTPRequestStateMachine {
336
340
if let expected = expectedBodyLength, expected != sentBodyBytes {
337
341
let error = HTTPClientError . bodyLengthMismatch
338
342
self . state = . failed( error)
343
+ promise? . fail ( error)
339
344
return . failRequest( error, . close)
340
345
}
341
346
342
347
self . state = . running( . endSent, . waitingForHead)
343
- return . sendRequestEnd
348
+ return . sendRequestEnd( promise )
344
349
345
350
case . running( . streaming( let expectedBodyLength, let sentBodyBytes, _) , . receivingBody( let head, let streamState) ) :
346
351
assert ( head. status. code < 300 )
347
352
348
353
if let expected = expectedBodyLength, expected != sentBodyBytes {
349
354
let error = HTTPClientError . bodyLengthMismatch
350
355
self . state = . failed( error)
356
+ promise? . fail ( error)
351
357
return . failRequest( error, . close)
352
358
}
353
359
354
360
self . state = . running( . endSent, . receivingBody( head, streamState) )
355
- return . sendRequestEnd
361
+ return . sendRequestEnd( promise )
356
362
357
363
case . running( . streaming( let expectedBodyLength, let sentBodyBytes, _) , . endReceived) :
358
364
if let expected = expectedBodyLength, expected != sentBodyBytes {
359
365
let error = HTTPClientError . bodyLengthMismatch
360
366
self . state = . failed( error)
367
+ promise? . fail ( error)
361
368
return . failRequest( error, . close)
362
369
}
363
370
364
371
self . state = . finished
372
+ promise? . succeed ( ( ) )
365
373
return . succeedRequest( . sendRequestEnd, . init( ) )
366
374
367
375
case . failed:
376
+ promise? . fail ( HTTPClientError . failed)
368
377
return . wait
369
378
370
379
case . finished:
@@ -377,6 +386,7 @@ struct HTTPRequestStateMachine {
377
386
378
387
// We may still receive something, here because of potential race conditions with the
379
388
// producing thread.
389
+ promise? . fail ( ChannelError . eof)
380
390
return . wait
381
391
382
392
case . modifying:
0 commit comments