Skip to content

Commit 50732cc

Browse files
authored
Properly map decoding failures (#22)
1 parent 6f36826 commit 50732cc

File tree

2 files changed

+18
-16
lines changed

2 files changed

+18
-16
lines changed

core/src/main/scala/org/ivovk/connect_rpc_scala/http/Headers.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ object Headers {
1010
@targetName("ConnectTimeoutMs")
1111
case class `Connect-Timeout-Ms`(value: Long)
1212

13-
@targetName("HeaderConnectTimeoutMs")
13+
@targetName("ConnectTimeoutMs$")
1414
object `Connect-Timeout-Ms` {
1515
def parse(s: String): ParseResult[`Connect-Timeout-Ms`] = {
1616
ParseResult.fromTryCatchNonFatal(s)(`Connect-Timeout-Ms`(s.toLong))
@@ -26,7 +26,7 @@ object Headers {
2626
@targetName("XTestCaseName")
2727
case class `X-Test-Case-Name`(value: String)
2828

29-
@targetName("HeaderXTestCaseName")
29+
@targetName("XTestCaseName$")
3030
object `X-Test-Case-Name` {
3131
@targetName("HeaderXTestCaseName")
3232
implicit val header: Header[`X-Test-Case-Name`, Header.Single] = Header.createRendered(

core/src/main/scala/org/ivovk/connect_rpc_scala/http/MessageCodec.scala

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.ivovk.connect_rpc_scala.http
22

33
import cats.Applicative
4-
import cats.data.EitherT
54
import cats.effect.{Async, Sync}
65
import cats.implicits.*
76
import com.google.protobuf.CodedOutputStream
@@ -10,7 +9,7 @@ import fs2.io.{readOutputStream, toInputStreamResource}
109
import fs2.text.decodeWithCharset
1110
import fs2.{Chunk, Stream}
1211
import org.http4s.headers.`Content-Type`
13-
import org.http4s.{ContentCoding, DecodeResult, Entity, EntityDecoder, EntityEncoder, MediaRange, MediaType}
12+
import org.http4s.{ContentCoding, DecodeResult, Entity, EntityDecoder, EntityEncoder, InvalidMessageBodyFailure, MediaRange, MediaType}
1413
import org.ivovk.connect_rpc_scala.ConnectRpcHttpRoutes.getClass
1514
import org.slf4j.{Logger, LoggerFactory}
1615
import scalapb.json4s.{JsonFormat, Printer}
@@ -54,17 +53,17 @@ class JsonMessageCodec[F[_] : Sync : Compression](printer: Printer) extends Mess
5453
.compile.string
5554
}
5655

57-
val f = string
56+
string
5857
.flatMap { str =>
5958
if (logger.isTraceEnabled) {
60-
logger.trace(s">>> Headers: ${entity.headers.redactSensitive}")
59+
logger.trace(s">>> Headers: ${entity.headers.redactSensitive()}")
6160
logger.trace(s">>> JSON: $str")
6261
}
6362

6463
Sync[F].delay(JsonFormat.fromJsonString(str))
6564
}
66-
67-
EitherT.right(f)
65+
.attemptT
66+
.leftMap(e => InvalidMessageBodyFailure(e.getMessage, e.some))
6867
}
6968

7069
override def encode[A <: Message](message: A): Entity[F] = {
@@ -93,7 +92,7 @@ class ProtoMessageCodec[F[_] : Async : Compression] extends MessageCodec[F] {
9392
override val mediaType: MediaType = MediaTypes.`application/proto`
9493

9594
override def decode[A <: Message](entity: RequestEntity[F])(using cmp: Companion[A]): DecodeResult[F, A] = {
96-
val f = entity.message match {
95+
val msg = entity.message match {
9796
case str: String =>
9897
Async[F].delay(base64dec.decode(str.getBytes(entity.charset.nioCharset)))
9998
.flatMap(arr => Async[F].delay(cmp.parseFrom(arr)))
@@ -102,14 +101,17 @@ class ProtoMessageCodec[F[_] : Async : Compression] extends MessageCodec[F] {
102101
.use(is => Async[F].delay(cmp.parseFrom(is)))
103102
}
104103

105-
EitherT.right(f.map { message =>
106-
if (logger.isTraceEnabled) {
107-
logger.trace(s">>> Headers: ${entity.headers.redactSensitive}")
108-
logger.trace(s">>> Proto: ${message.toProtoString}")
109-
}
104+
msg
105+
.map { message =>
106+
if (logger.isTraceEnabled) {
107+
logger.trace(s">>> Headers: ${entity.headers.redactSensitive()}")
108+
logger.trace(s">>> Proto: ${message.toProtoString}")
109+
}
110110

111-
message
112-
})
111+
message
112+
}
113+
.attemptT
114+
.leftMap(e => InvalidMessageBodyFailure(e.getMessage, e.some))
113115
}
114116

115117
override def encode[A <: Message](message: A): Entity[F] = {

0 commit comments

Comments
 (0)