Skip to content

Commit 1d935af

Browse files
committed
unaryToStream also with content-length
1 parent c1c5a59 commit 1d935af

File tree

1 file changed

+31
-29
lines changed

1 file changed

+31
-29
lines changed

core/src/main/scala/org/http4s/grpc/ClientGrpc.scala

+31-29
Original file line numberDiff line numberDiff line change
@@ -65,35 +65,37 @@ object ClientGrpc {
6565
)( // Stuff we apply at invocation
6666
message: A,
6767
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, ())
7981

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+
}
9799

98100
def streamToUnary[F[_]: Concurrent, A, B]( // Stuff We can provide via codegen
99101
encode: Encoder[A],
@@ -107,7 +109,7 @@ object ClientGrpc {
107109
message: Stream[F, A],
108110
ctx: Headers,
109111
): 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`)
111113
.putHeaders(
112114
SharedGrpc.TE,
113115
SharedGrpc.GrpcEncoding,

0 commit comments

Comments
 (0)