@@ -29,15 +29,15 @@ extension HTTPClient {
2929extension RequestBag {
3030 struct StateMachine {
3131 fileprivate enum State {
32- case initialized
33- case queued( HTTPRequestScheduler )
32+ case initialized( RedirectHandler < Delegate . Response > ? )
33+ case queued( HTTPRequestScheduler , RedirectHandler < Delegate . Response > ? )
3434 /// if the deadline was exceeded while in the `.queued(_:)` state,
3535 /// we wait until the request pool fails the request with a potential more descriptive error message,
3636 /// if a connection failure has occured while the request was queued.
3737 case deadlineExceededWhileQueued
3838 case executing( HTTPRequestExecutor , RequestStreamState , ResponseStreamState )
3939 case finished( error: Error ? )
40- case redirected( HTTPRequestExecutor , Int , HTTPResponseHead , URL )
40+ case redirected( HTTPRequestExecutor , RedirectHandler < Delegate . Response > , Int , HTTPResponseHead , URL )
4141 case modifying
4242 }
4343
@@ -55,23 +55,22 @@ extension RequestBag {
5555 case eof
5656 }
5757
58- case initialized
58+ case initialized( RedirectHandler < Delegate . Response > ? )
5959 case buffering( CircularBuffer < ByteBuffer > , next: Next )
6060 case waitingForRemote
6161 }
6262
63- private var state : State = . initialized
64- private let redirectHandler : RedirectHandler < Delegate . Response > ?
63+ private var state : State
6564
6665 init ( redirectHandler: RedirectHandler < Delegate . Response > ? ) {
67- self . redirectHandler = redirectHandler
66+ self . state = . initialized ( redirectHandler)
6867 }
6968 }
7069}
7170
7271extension RequestBag . StateMachine {
7372 mutating func requestWasQueued( _ scheduler: HTTPRequestScheduler ) {
74- guard case . initialized = self . state else {
73+ guard case . initialized( let redirectHandler ) = self . state else {
7574 // There might be a race between `requestWasQueued` and `willExecuteRequest`:
7675 //
7776 // If the request is created and passed to the HTTPClient on thread A, it will move into
@@ -91,7 +90,7 @@ extension RequestBag.StateMachine {
9190 return
9291 }
9392
94- self . state = . queued( scheduler)
93+ self . state = . queued( scheduler, redirectHandler )
9594 }
9695
9796 enum WillExecuteRequestAction {
@@ -102,8 +101,8 @@ extension RequestBag.StateMachine {
102101
103102 mutating func willExecuteRequest( _ executor: HTTPRequestExecutor ) -> WillExecuteRequestAction {
104103 switch self . state {
105- case . initialized, . queued:
106- self . state = . executing( executor, . initialized, . initialized)
104+ case . initialized( let redirectHandler ) , . queued( _ , let redirectHandler ) :
105+ self . state = . executing( executor, . initialized, . initialized( redirectHandler ) )
107106 return . none
108107 case . deadlineExceededWhileQueued:
109108 let error : Error = HTTPClientError . deadlineExceeded
@@ -127,8 +126,8 @@ extension RequestBag.StateMachine {
127126 case . initialized, . queued, . deadlineExceededWhileQueued:
128127 preconditionFailure ( " A request stream can only be resumed, if the request was started " )
129128
130- case . executing( let executor, . initialized, . initialized) :
131- self . state = . executing( executor, . producing, . initialized)
129+ case . executing( let executor, . initialized, . initialized( let redirectHandler ) ) :
130+ self . state = . executing( executor, . producing, . initialized( redirectHandler ) )
132131 return . startWriter
133132
134133 case . executing( _, . producing, _) :
@@ -299,11 +298,11 @@ extension RequestBag.StateMachine {
299298 case . initialized, . queued, . deadlineExceededWhileQueued:
300299 preconditionFailure ( " How can we receive a response, if the request hasn't started yet. " )
301300 case . executing( let executor, let requestState, let responseState) :
302- guard case . initialized = responseState else {
301+ guard case . initialized( let redirectHandler ) = responseState else {
303302 preconditionFailure ( " If we receive a response, we must not have received something else before " )
304303 }
305304
306- if let redirectURL = self . redirectHandler? . redirectTarget (
305+ if let redirectHandler = redirectHandler , let redirectURL = redirectHandler. redirectTarget (
307306 status: head. status,
308307 responseHeaders: head. headers
309308 ) {
@@ -312,11 +311,11 @@ extension RequestBag.StateMachine {
312311 // smaller than 3kb.
313312 switch head. contentLength {
314313 case . some( 0 ... ( HTTPClient . maxBodySizeRedirectResponse) ) , . none:
315- self . state = . redirected( executor, 0 , head, redirectURL)
314+ self . state = . redirected( executor, redirectHandler , 0 , head, redirectURL)
316315 return . signalBodyDemand( executor)
317316 case . some:
318317 self . state = . finished( error: HTTPClientError . cancelled)
319- return . redirect( executor, self . redirectHandler! , head, redirectURL)
318+ return . redirect( executor, redirectHandler, head, redirectURL)
320319 }
321320 } else {
322321 self . state = . executing( executor, requestState, . buffering( . init( ) , next: . askExecutorForMore) )
@@ -369,15 +368,15 @@ extension RequestBag.StateMachine {
369368 } else {
370369 return . none
371370 }
372- case . redirected( let executor, var receivedBytes, let head, let redirectURL) :
371+ case . redirected( let executor, let redirectHandler , var receivedBytes, let head, let redirectURL) :
373372 let partsLength = buffer. reduce ( into: 0 ) { $0 += $1. readableBytes }
374373 receivedBytes += partsLength
375374
376375 if receivedBytes > HTTPClient . maxBodySizeRedirectResponse {
377376 self . state = . finished( error: HTTPClientError . cancelled)
378- return . redirect( executor, self . redirectHandler! , head, redirectURL)
377+ return . redirect( executor, redirectHandler, head, redirectURL)
379378 } else {
380- self . state = . redirected( executor, receivedBytes, head, redirectURL)
379+ self . state = . redirected( executor, redirectHandler , receivedBytes, head, redirectURL)
381380 return . signalBodyDemand( executor)
382381 }
383382
@@ -428,9 +427,9 @@ extension RequestBag.StateMachine {
428427 self . state = . executing( executor, requestState, . buffering( newChunks, next: . eof) )
429428 return . consume( first)
430429
431- case . redirected( _, _, let head, let redirectURL) :
430+ case . redirected( _, let redirectHandler , _, let head, let redirectURL) :
432431 self . state = . finished( error: nil )
433- return . redirect( self . redirectHandler! , head, redirectURL)
432+ return . redirect( redirectHandler, head, redirectURL)
434433
435434 case . finished( error: . some) :
436435 return . none
@@ -553,7 +552,7 @@ extension RequestBag.StateMachine {
553552
554553 mutating func deadlineExceeded( ) -> DeadlineExceededAction {
555554 switch self . state {
556- case . queued( let queuer) :
555+ case . queued( let queuer, _ ) :
557556 /// We do not fail the request immediately because we want to give the scheduler a chance of throwing a better error message
558557 /// We therefore depend on the scheduler failing the request after we cancel the request.
559558 self . state = . deadlineExceededWhileQueued
@@ -582,7 +581,7 @@ extension RequestBag.StateMachine {
582581 case . initialized:
583582 self . state = . finished( error: error)
584583 return . failTask( error, nil , nil )
585- case . queued( let queuer) :
584+ case . queued( let queuer, _ ) :
586585 self . state = . finished( error: error)
587586 return . failTask( error, queuer, nil )
588587 case . executing( let executor, let requestState, . buffering( _, next: . eof) ) :
0 commit comments