@@ -303,7 +303,11 @@ extension HTTP2ToRawGRPCStateMachine.State {
303
303
}
304
304
305
305
// Figure out which encoding we should use for responses.
306
- let ( writer, responseEncoding) = self . extractResponseEncoding ( from: headers, encoding: encoding)
306
+ let ( writer, responseEncoding) = self . extractResponseEncoding (
307
+ from: headers,
308
+ encoding: encoding,
309
+ allocator: allocator
310
+ )
307
311
308
312
// Parse the path, and create a call handler.
309
313
guard let path = headers. first ( name: " :path " ) else {
@@ -516,7 +520,8 @@ extension HTTP2ToRawGRPCStateMachine.State {
516
520
/// - Returns: A message writer and the response encoding header to send back to the client.
517
521
private func extractResponseEncoding(
518
522
from headers: HPACKHeaders ,
519
- encoding: ServerMessageEncoding
523
+ encoding: ServerMessageEncoding ,
524
+ allocator: ByteBufferAllocator
520
525
) -> ( LengthPrefixedMessageWriter , String ? ) {
521
526
let writer : LengthPrefixedMessageWriter
522
527
let responseEncoding : String ?
@@ -534,12 +539,12 @@ extension HTTP2ToRawGRPCStateMachine.State {
534
539
configuration. enabledAlgorithms. contains ( $0)
535
540
}
536
541
537
- writer = LengthPrefixedMessageWriter ( compression: algorithm)
542
+ writer = LengthPrefixedMessageWriter ( compression: algorithm, allocator : allocator )
538
543
responseEncoding = algorithm? . name
539
544
540
545
case . disabled:
541
546
// The server doesn't have compression enabled.
542
- writer = LengthPrefixedMessageWriter ( compression: . none)
547
+ writer = LengthPrefixedMessageWriter ( compression: . none, allocator : allocator )
543
548
responseEncoding = nil
544
549
}
545
550
@@ -642,44 +647,39 @@ extension HTTP2ToRawGRPCStateMachine {
642
647
static func writeGRPCFramedMessage(
643
648
_ buffer: ByteBuffer ,
644
649
compress: Bool ,
645
- allocator: ByteBufferAllocator ,
646
- writer: LengthPrefixedMessageWriter
647
- ) -> Result < ByteBuffer , Error > {
650
+ writer: inout LengthPrefixedMessageWriter
651
+ ) -> Result < ( ByteBuffer , ByteBuffer ? ) , Error > {
648
652
do {
649
- let prefixed = try writer. write ( buffer: buffer, allocator : allocator , compressed: compress)
650
- return . success( prefixed )
653
+ let buffers = try writer. write ( buffer: buffer, compressed: compress)
654
+ return . success( buffers )
651
655
} catch {
652
656
return . failure( error)
653
657
}
654
658
}
655
659
}
656
660
657
661
extension HTTP2ToRawGRPCStateMachine . RequestOpenResponseOpenState {
658
- func send(
662
+ mutating func send(
659
663
buffer: ByteBuffer ,
660
- allocator: ByteBufferAllocator ,
661
664
compress: Bool
662
- ) -> Result < ByteBuffer , Error > {
665
+ ) -> Result < ( ByteBuffer , ByteBuffer ? ) , Error > {
663
666
return HTTP2ToRawGRPCStateMachine . writeGRPCFramedMessage (
664
667
buffer,
665
668
compress: compress,
666
- allocator: allocator,
667
- writer: self . writer
669
+ writer: & self . writer
668
670
)
669
671
}
670
672
}
671
673
672
674
extension HTTP2ToRawGRPCStateMachine . RequestClosedResponseOpenState {
673
- func send(
675
+ mutating func send(
674
676
buffer: ByteBuffer ,
675
- allocator: ByteBufferAllocator ,
676
677
compress: Bool
677
- ) -> Result < ByteBuffer , Error > {
678
+ ) -> Result < ( ByteBuffer , ByteBuffer ? ) , Error > {
678
679
return HTTP2ToRawGRPCStateMachine . writeGRPCFramedMessage (
679
680
buffer,
680
681
compress: compress,
681
- allocator: allocator,
682
- writer: self . writer
682
+ writer: & self . writer
683
683
)
684
684
}
685
685
}
@@ -903,12 +903,14 @@ extension HTTP2ToRawGRPCStateMachine {
903
903
}
904
904
905
905
/// Send a response buffer.
906
- func send(
906
+ mutating func send(
907
907
buffer: ByteBuffer ,
908
908
allocator: ByteBufferAllocator ,
909
909
compress: Bool
910
- ) -> Result < ByteBuffer , Error > {
911
- return self . state. send ( buffer: buffer, allocator: allocator, compress: compress)
910
+ ) -> Result < ( ByteBuffer , ByteBuffer ? ) , Error > {
911
+ return self . withStateAvoidingCoWs { state in
912
+ state. send ( buffer: buffer, allocator: allocator, compress: compress)
913
+ }
912
914
}
913
915
914
916
/// Send status and trailers.
@@ -1115,11 +1117,11 @@ extension HTTP2ToRawGRPCStateMachine.State {
1115
1117
}
1116
1118
}
1117
1119
1118
- func send(
1120
+ mutating func send(
1119
1121
buffer: ByteBuffer ,
1120
1122
allocator: ByteBufferAllocator ,
1121
1123
compress: Bool
1122
- ) -> Result < ByteBuffer , Error > {
1124
+ ) -> Result < ( ByteBuffer , ByteBuffer ? ) , Error > {
1123
1125
switch self {
1124
1126
case . requestIdleResponseIdle:
1125
1127
preconditionFailure ( " Invalid state: the request stream is still closed " )
@@ -1129,19 +1131,21 @@ extension HTTP2ToRawGRPCStateMachine.State {
1129
1131
let error = GRPCError . InvalidState ( " Response headers must be sent before response message " )
1130
1132
return . failure( error)
1131
1133
1132
- case let . requestOpenResponseOpen( state) :
1133
- return state. send (
1134
+ case var . requestOpenResponseOpen( state) :
1135
+ let result = state. send (
1134
1136
buffer: buffer,
1135
- allocator: allocator,
1136
1137
compress: compress
1137
1138
)
1139
+ self = . requestOpenResponseOpen( state)
1140
+ return result
1138
1141
1139
- case let . requestClosedResponseOpen( state) :
1140
- return state. send (
1142
+ case var . requestClosedResponseOpen( state) :
1143
+ let result = state. send (
1141
1144
buffer: buffer,
1142
- allocator: allocator,
1143
1145
compress: compress
1144
1146
)
1147
+ self = . requestClosedResponseOpen( state)
1148
+ return result
1145
1149
1146
1150
case . requestOpenResponseClosed,
1147
1151
. requestClosedResponseClosed:
0 commit comments