@@ -65,35 +65,37 @@ object ClientGrpc {
65
65
)( // Stuff we apply at invocation
66
66
message : A ,
67
67
ctx : Headers ,
68
- ): Stream [F , B ] = {
69
- val req = Request (Method .POST , baseUri / serviceName / methodName, HttpVersion .`HTTP/2`)
70
- .putHeaders(
71
- SharedGrpc .TE ,
72
- SharedGrpc .GrpcEncoding ,
73
- SharedGrpc .GrpcAcceptEncoding ,
74
- SharedGrpc .ContentType ,
75
- )
76
- .putHeaders(ctx.headers.map(Header .ToRaw .rawToRaw): _* )
77
- .withBodyStream(codecs.Messages .encodeSingle(encode)(message))
78
- .withAttribute(H2Keys .Http2PriorKnowledge , ())
68
+ ): Stream [F , B ] =
69
+ Stream .eval(codecs.Messages .encodeToChunk(encode)(message)).flatMap { chunk =>
70
+ val req = Request [F ](Method .POST , baseUri / serviceName / methodName, HttpVersion .`HTTP/2`)
71
+ .putHeaders(
72
+ SharedGrpc .TE ,
73
+ SharedGrpc .GrpcEncoding ,
74
+ SharedGrpc .GrpcAcceptEncoding ,
75
+ SharedGrpc .ContentType ,
76
+ `Content-Length`(chunk.size.toLong),
77
+ )
78
+ .putHeaders(ctx.headers.map(Header .ToRaw .rawToRaw): _* )
79
+ .withBodyStream(Stream .chunk(chunk))
80
+ .withAttribute(H2Keys .Http2PriorKnowledge , ())
79
81
80
- Stream
81
- .resource(client.run(req))
82
- .flatMap(resp =>
83
- Stream .eval(handleFailure(resp.headers)).drain ++
84
- codecs.Messages
85
- .decode[F , B ](decode)(resp.body)
86
- .handleErrorWith(e =>
87
- Stream .eval(
88
- resp.trailerHeaders
89
- .flatMap(handleFailure[F ])
90
- .attempt
91
- .flatMap(t => t.as(e).merge.raiseError[F , B ])
92
- )
93
- ) ++
94
- Stream .eval(resp.trailerHeaders).evalMap(handleFailure[F ]).drain
95
- )
96
- }
82
+ Stream
83
+ .resource(client.run(req))
84
+ .flatMap(resp =>
85
+ Stream .eval(handleFailure(resp.headers)).drain ++
86
+ codecs.Messages
87
+ .decode[F , B ](decode)(resp.body)
88
+ .handleErrorWith(e =>
89
+ Stream .eval(
90
+ resp.trailerHeaders
91
+ .flatMap(handleFailure[F ])
92
+ .attempt
93
+ .flatMap(t => t.as(e).merge.raiseError[F , B ])
94
+ )
95
+ ) ++
96
+ Stream .eval(resp.trailerHeaders).evalMap(handleFailure[F ]).drain
97
+ )
98
+ }
97
99
98
100
def streamToUnary [F [_]: Concurrent , A , B ]( // Stuff We can provide via codegen
99
101
encode : Encoder [A ],
@@ -107,7 +109,7 @@ object ClientGrpc {
107
109
message : Stream [F , A ],
108
110
ctx : Headers ,
109
111
): F [B ] = {
110
- val req = Request (Method .POST , baseUri / serviceName / methodName, HttpVersion .`HTTP/2`)
112
+ val req = Request [ F ] (Method .POST , baseUri / serviceName / methodName, HttpVersion .`HTTP/2`)
111
113
.putHeaders(
112
114
SharedGrpc .TE ,
113
115
SharedGrpc .GrpcEncoding ,
0 commit comments