@@ -42,6 +42,11 @@ final actor LambdaRuntimeClient: LambdaRuntimeClientProtocol {
4242 self . runtimeClient = runtimeClient
4343 }
4444
45+ @usableFromInline
46+ func writeHeaders( _ headers: HTTPHeaders ) async throws {
47+ try await self . runtimeClient. appendHeaders ( headers)
48+ }
49+
4550 @usableFromInline
4651 func write( _ buffer: NIOCore . ByteBuffer ) async throws {
4752 try await self . runtimeClient. write ( buffer)
@@ -188,6 +193,13 @@ final actor LambdaRuntimeClient: LambdaRuntimeClientProtocol {
188193 }
189194 }
190195
196+ // we can use a var here because we are always isolated to this actor
197+ private var userHeaders = HTTPHeaders ( )
198+ private func appendHeaders( _ headers: HTTPHeaders ) async throws {
199+ // buffer the data to send them when we will send the headers
200+ userHeaders. add ( contentsOf: headers)
201+ }
202+
191203 private func write( _ buffer: NIOCore . ByteBuffer ) async throws {
192204 switch self . lambdaState {
193205 case . idle, . sentResponse:
@@ -205,7 +217,7 @@ final actor LambdaRuntimeClient: LambdaRuntimeClientProtocol {
205217 guard case . sendingResponse( requestID) = self . lambdaState else {
206218 fatalError ( " Invalid state: \( self . lambdaState) " )
207219 }
208- return try await handler. writeResponseBodyPart ( buffer, requestID: requestID)
220+ return try await handler. writeResponseBodyPart ( self . userHeaders , buffer, requestID: requestID)
209221 }
210222 }
211223
@@ -555,6 +567,7 @@ private final class LambdaChannelHandler<Delegate: LambdaChannelHandlerDelegate>
555567
556568 func writeResponseBodyPart(
557569 isolation: isolated ( any Actor ) ? = #isolation,
570+ _ userHeaders: HTTPHeaders ,
558571 _ byteBuffer: ByteBuffer ,
559572 requestID: String
560573 ) async throws {
@@ -564,10 +577,10 @@ private final class LambdaChannelHandler<Delegate: LambdaChannelHandlerDelegate>
564577
565578 case . connected( let context, . waitingForResponse) :
566579 self . state = . connected( context, . sendingResponse)
567- try await self . sendResponseBodyPart ( byteBuffer, sendHeadWithRequestID: requestID, context: context)
580+ try await self . sendResponseBodyPart ( userHeaders , byteBuffer, sendHeadWithRequestID: requestID, context: context)
568581
569582 case . connected( let context, . sendingResponse) :
570- try await self . sendResponseBodyPart ( byteBuffer, sendHeadWithRequestID: nil , context: context)
583+ try await self . sendResponseBodyPart ( userHeaders , byteBuffer, sendHeadWithRequestID: nil , context: context)
571584
572585 case . connected( _, . idle) ,
573586 . connected( _, . sentResponse) :
@@ -616,6 +629,7 @@ private final class LambdaChannelHandler<Delegate: LambdaChannelHandlerDelegate>
616629
617630 private func sendResponseBodyPart(
618631 isolation: isolated ( any Actor ) ? = #isolation,
632+ _ userHeaders: HTTPHeaders ,
619633 _ byteBuffer: ByteBuffer ,
620634 sendHeadWithRequestID: String ? ,
621635 context: ChannelHandlerContext
@@ -625,13 +639,16 @@ private final class LambdaChannelHandler<Delegate: LambdaChannelHandlerDelegate>
625639 // TODO: This feels super expensive. We should be able to make this cheaper. requestIDs are fixed length
626640 let url = Consts . invocationURLPrefix + " / " + requestID + Consts. postResponseURLSuffix
627641
642+ var responseHeaders = self . streamingHeaders
643+ responseHeaders. add ( contentsOf: userHeaders)
644+ logger. trace ( " sendResponseBodyPart : ========== Sending response headers: \( responseHeaders) " )
628645 let httpRequest = HTTPRequestHead (
629646 version: . http1_1,
630647 method: . POST,
631648 uri: url,
632- headers: self . streamingHeaders
649+ headers: responseHeaders
633650 )
634-
651+
635652 context. write ( self . wrapOutboundOut ( . head( httpRequest) ) , promise: nil )
636653 }
637654
@@ -663,13 +680,13 @@ private final class LambdaChannelHandler<Delegate: LambdaChannelHandlerDelegate>
663680 self . streamingHeaders
664681 }
665682
683+ logger. trace ( " sendResponseFinish : ========== Sending response headers: \( headers) " )
666684 let httpRequest = HTTPRequestHead (
667685 version: . http1_1,
668686 method: . POST,
669687 uri: url,
670688 headers: headers
671689 )
672-
673690 context. write ( self . wrapOutboundOut ( . head( httpRequest) ) , promise: nil )
674691 }
675692
0 commit comments