@@ -31,7 +31,7 @@ extension Transaction {
3131 case queued( CheckedContinuation < HTTPClientResponse , Error > , HTTPRequestScheduler )
3232 case deadlineExceededWhileQueued( CheckedContinuation < HTTPClientResponse , Error > )
3333 case executing( ExecutionContext , RequestStreamState , ResponseStreamState )
34- case finished( error : Error ? )
34+ case finished( Result < HTTPHeaders ? , any Error > )
3535 }
3636
3737 fileprivate enum RequestStreamState : Sendable {
@@ -47,7 +47,7 @@ extension Transaction {
4747 case waitingForResponseHead
4848 // streaming response body. Valid transitions to: finished.
4949 case streamingBody( TransactionBody . Source )
50- case finished
50+ case finished( HTTPHeaders ? )
5151 }
5252
5353 private var state : State
@@ -105,11 +105,11 @@ extension Transaction {
105105 mutating func fail( _ error: Error ) -> FailAction {
106106 switch self . state {
107107 case . initialized( let continuation) :
108- self . state = . finished( error: error )
108+ self . state = . finished( . failure ( error) )
109109 return . failResponseHead( continuation, error, nil , nil , bodyStreamContinuation: nil )
110110
111111 case . queued( let continuation, let scheduler) :
112- self . state = . finished( error: error )
112+ self . state = . finished( . failure ( error) )
113113 return . failResponseHead( continuation, error, scheduler, nil , bodyStreamContinuation: nil )
114114 case . deadlineExceededWhileQueued( let continuation) :
115115 let realError : Error = {
@@ -123,12 +123,12 @@ extension Transaction {
123123 }
124124 } ( )
125125
126- self . state = . finished( error : realError)
126+ self . state = . finished( . failure ( realError) )
127127 return . failResponseHead( continuation, realError, nil , nil , bodyStreamContinuation: nil )
128128 case . executing( let context, let requestStreamState, . waitingForResponseHead) :
129129 switch requestStreamState {
130130 case . paused( continuation: . some( let continuation) ) :
131- self . state = . finished( error: error )
131+ self . state = . finished( . failure ( error) )
132132 return . failResponseHead(
133133 context. continuation,
134134 error,
@@ -138,7 +138,7 @@ extension Transaction {
138138 )
139139
140140 case . requestHeadSent, . endForwarded, . finished, . producing, . paused( continuation: . none) :
141- self . state = . finished( error: error )
141+ self . state = . finished( . failure ( error) )
142142 return . failResponseHead(
143143 context. continuation,
144144 error,
@@ -149,7 +149,7 @@ extension Transaction {
149149 }
150150
151151 case . executing( let context, let requestStreamState, . streamingBody( let source) ) :
152- self . state = . finished( error: error )
152+ self . state = . finished( . failure ( error) )
153153 switch requestStreamState {
154154 case . paused( let bodyStreamContinuation) :
155155 return . failResponseStream(
@@ -164,7 +164,7 @@ extension Transaction {
164164
165165 case . executing( let context, let requestStreamState, . finished) :
166166 // an error occured after full response received, but before the full request was sent
167- self . state = . finished( error: error )
167+ self . state = . finished( . failure ( error) )
168168 switch requestStreamState {
169169 case . paused( let bodyStreamContinuation) :
170170 if let bodyStreamContinuation {
@@ -205,14 +205,14 @@ extension Transaction {
205205 return . none
206206 case . deadlineExceededWhileQueued( let continuation) :
207207 let error = HTTPClientError . deadlineExceeded
208- self . state = . finished( error: error )
208+ self . state = . finished( . failure ( error) )
209209 return . cancelAndFail( executor, continuation, with: error)
210210
211- case . finished( error : . some ) :
211+ case . finished( . failure ) :
212212 return . cancel( executor)
213213
214214 case . executing,
215- . finished( error : . none ) :
215+ . finished( . success ) :
216216 preconditionFailure ( " Invalid state: \( self . state) " )
217217 }
218218 }
@@ -402,8 +402,8 @@ extension Transaction {
402402 assertionFailure ( " Invalid state: \( self . state) " )
403403 return . failure( HTTPClientError . internalStateFailure ( ) )
404404
405- case . executing( _, . endForwarded, . finished) :
406- self . state = . finished( error : nil )
405+ case . executing( _, . endForwarded, . finished( let trailers ) ) :
406+ self . state = . finished( . success ( trailers ) )
407407 return . none
408408
409409 case . executing( let context, . endForwarded, let responseState) :
@@ -446,12 +446,12 @@ extension Transaction {
446446 self . state = . executing( context, requestState, . streamingBody( body. source) )
447447 return . succeedResponseHead( body. sequence, context. continuation)
448448
449- case . finished( error : . some ) :
449+ case . finished( . failure ) :
450450 // If the request failed before, we don't need to do anything in response to
451451 // receiving the response head.
452452 return . none
453453
454- case . finished( error : . none ) :
454+ case . finished( . success ) :
455455 preconditionFailure ( " How can the request be finished without error, before receiving response head? " )
456456 }
457457 }
@@ -511,7 +511,10 @@ extension Transaction {
511511 case none
512512 }
513513
514- mutating func receiveResponseEnd( _ newChunks: CircularBuffer < ByteBuffer > ? ) -> ReceiveResponseEndAction {
514+ mutating func receiveResponseEnd(
515+ _ newChunks: CircularBuffer < ByteBuffer > ? ,
516+ trailers: HTTPHeaders ?
517+ ) -> ReceiveResponseEndAction {
515518 switch self . state {
516519 case . initialized,
517520 . queued,
@@ -524,9 +527,9 @@ extension Transaction {
524527 case . executing( let context, let requestState, . streamingBody( let source) ) :
525528 switch requestState {
526529 case . finished:
527- self . state = . finished( error : nil )
530+ self . state = . finished( . success ( trailers ) )
528531 case . paused, . producing, . requestHeadSent, . endForwarded:
529- self . state = . executing( context, requestState, . finished)
532+ self . state = . executing( context, requestState, . finished( trailers ) )
530533 }
531534 return . finishResponseStream( source, finalBody: newChunks)
532535
@@ -540,6 +543,18 @@ extension Transaction {
540543 }
541544 }
542545
546+ var trailers : HTTPHeaders ? {
547+ switch self . state {
548+ case . deadlineExceededWhileQueued, . initialized, . queued,
549+ . executing( _, _, . waitingForResponseHead) ,
550+ . executing( _, _, . streamingBody) ,
551+ . finished( . failure) :
552+ return nil
553+ case . executing( _, _, . finished( let trailers) ) , . finished( . success( let trailers) ) :
554+ return trailers
555+ }
556+ }
557+
543558 mutating func httpResponseStreamTerminated( ) -> FailAction {
544559 switch self . state {
545560 case . executing( _, _, . finished) , . finished:
@@ -565,7 +580,7 @@ extension Transaction {
565580 let error = HTTPClientError . deadlineExceeded
566581 switch self . state {
567582 case . initialized( let continuation) :
568- self . state = . finished( error: error )
583+ self . state = . finished( . failure ( error) )
569584 return . cancel(
570585 requestContinuation: continuation,
571586 scheduler: nil ,
@@ -583,15 +598,15 @@ extension Transaction {
583598 case . executing( let context, let requestStreamState, . waitingForResponseHead) :
584599 switch requestStreamState {
585600 case . paused( continuation: . some( let continuation) ) :
586- self . state = . finished( error: error )
601+ self . state = . finished( . failure ( error) )
587602 return . cancel(
588603 requestContinuation: context. continuation,
589604 scheduler: nil ,
590605 executor: context. executor,
591606 bodyStreamContinuation: continuation
592607 )
593608 case . requestHeadSent, . endForwarded, . finished, . producing, . paused( continuation: . none) :
594- self . state = . finished( error: error )
609+ self . state = . finished( . failure ( error) )
595610 return . cancel(
596611 requestContinuation: context. continuation,
597612 scheduler: nil ,
0 commit comments