@@ -42,6 +42,11 @@ final actor LambdaRuntimeClient: LambdaRuntimeClientProtocol {
42
42
self . runtimeClient = runtimeClient
43
43
}
44
44
45
+ @usableFromInline
46
+ func writeHeaders( _ headers: HTTPHeaders ) async throws {
47
+ try await self . runtimeClient. appendHeaders ( headers)
48
+ }
49
+
45
50
@usableFromInline
46
51
func write( _ buffer: NIOCore . ByteBuffer ) async throws {
47
52
try await self . runtimeClient. write ( buffer)
@@ -188,6 +193,13 @@ final actor LambdaRuntimeClient: LambdaRuntimeClientProtocol {
188
193
}
189
194
}
190
195
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
+
191
203
private func write( _ buffer: NIOCore . ByteBuffer ) async throws {
192
204
switch self . lambdaState {
193
205
case . idle, . sentResponse:
@@ -205,7 +217,7 @@ final actor LambdaRuntimeClient: LambdaRuntimeClientProtocol {
205
217
guard case . sendingResponse( requestID) = self . lambdaState else {
206
218
fatalError ( " Invalid state: \( self . lambdaState) " )
207
219
}
208
- return try await handler. writeResponseBodyPart ( buffer, requestID: requestID)
220
+ return try await handler. writeResponseBodyPart ( self . userHeaders , buffer, requestID: requestID)
209
221
}
210
222
}
211
223
@@ -555,6 +567,7 @@ private final class LambdaChannelHandler<Delegate: LambdaChannelHandlerDelegate>
555
567
556
568
func writeResponseBodyPart(
557
569
isolation: isolated ( any Actor ) ? = #isolation,
570
+ _ userHeaders: HTTPHeaders ,
558
571
_ byteBuffer: ByteBuffer ,
559
572
requestID: String
560
573
) async throws {
@@ -564,10 +577,10 @@ private final class LambdaChannelHandler<Delegate: LambdaChannelHandlerDelegate>
564
577
565
578
case . connected( let context, . waitingForResponse) :
566
579
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)
568
581
569
582
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)
571
584
572
585
case . connected( _, . idle) ,
573
586
. connected( _, . sentResponse) :
@@ -616,6 +629,7 @@ private final class LambdaChannelHandler<Delegate: LambdaChannelHandlerDelegate>
616
629
617
630
private func sendResponseBodyPart(
618
631
isolation: isolated ( any Actor ) ? = #isolation,
632
+ _ userHeaders: HTTPHeaders ,
619
633
_ byteBuffer: ByteBuffer ,
620
634
sendHeadWithRequestID: String ? ,
621
635
context: ChannelHandlerContext
@@ -625,13 +639,16 @@ private final class LambdaChannelHandler<Delegate: LambdaChannelHandlerDelegate>
625
639
// TODO: This feels super expensive. We should be able to make this cheaper. requestIDs are fixed length
626
640
let url = Consts . invocationURLPrefix + " / " + requestID + Consts. postResponseURLSuffix
627
641
642
+ var responseHeaders = self . streamingHeaders
643
+ responseHeaders. add ( contentsOf: userHeaders)
644
+ logger. trace ( " sendResponseBodyPart : ========== Sending response headers: \( responseHeaders) " )
628
645
let httpRequest = HTTPRequestHead (
629
646
version: . http1_1,
630
647
method: . POST,
631
648
uri: url,
632
- headers: self . streamingHeaders
649
+ headers: responseHeaders
633
650
)
634
-
651
+
635
652
context. write ( self . wrapOutboundOut ( . head( httpRequest) ) , promise: nil )
636
653
}
637
654
@@ -663,13 +680,13 @@ private final class LambdaChannelHandler<Delegate: LambdaChannelHandlerDelegate>
663
680
self . streamingHeaders
664
681
}
665
682
683
+ logger. trace ( " sendResponseFinish : ========== Sending response headers: \( headers) " )
666
684
let httpRequest = HTTPRequestHead (
667
685
version: . http1_1,
668
686
method: . POST,
669
687
uri: url,
670
688
headers: headers
671
689
)
672
-
673
690
context. write ( self . wrapOutboundOut ( . head( httpRequest) ) , promise: nil )
674
691
}
675
692
0 commit comments