Skip to content

Commit

Permalink
Update HttpContentCodec.scala
Browse files Browse the repository at this point in the history
  • Loading branch information
asr2003 authored Nov 9, 2024
1 parent 83cae03 commit 6599188
Showing 1 changed file with 45 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,23 @@ sealed trait HttpContentCodec[A] { self =>
lookup(contentType) match {
case Some((_, codec)) =>
request.body.asChunk.flatMap { bytes =>
ZIO.fromEither(codec.codec(config).decode(bytes))
ZIO
.fromEither(codec.codec(config).decode(bytes))
.mapError(_ => CodecDecodeError(s"Failed to decode request body for media type: $contentType"))
.tapError(error =>
ErrorResponseConfig.configRef.get.flatMap { errConfig =>
if (errConfig.logCodecErrors) ZIO.logWarning(error.getMessage) else ZIO.unit
},
)
}
case None =>
ZIO.fail(throw new IllegalArgumentException(s"No codec found for content type $contentType"))
ZIO
.fail(UnsupportedMediaTypeError(contentType))
.tapError(error =>
ErrorResponseConfig.configRef.get.flatMap { errConfig =>
if (errConfig.logCodecErrors) ZIO.logWarning(error.getMessage) else ZIO.unit
},
)
}
}

Expand All @@ -47,10 +60,23 @@ sealed trait HttpContentCodec[A] { self =>
lookup(contentType) match {
case Some((_, codec)) =>
response.body.asChunk.flatMap { bytes =>
ZIO.fromEither(codec.codec(config).decode(bytes))
ZIO
.fromEither(codec.codec(config).decode(bytes))
.mapError(_ => CodecDecodeError(s"Failed to decode response body for media type: $contentType"))
.tapError(error =>
ErrorResponseConfig.configRef.get.flatMap { errConfig =>
if (errConfig.logCodecErrors) ZIO.logWarning(error.getMessage) else ZIO.unit
},
)
}
case None =>
ZIO.fail(throw new IllegalArgumentException(s"No codec found for content type $contentType"))
ZIO
.fail(UnsupportedMediaTypeError(contentType))
.tapError(error =>
ErrorResponseConfig.configRef.get.flatMap { errConfig =>
if (errConfig.logCodecErrors) ZIO.logWarning(error.getMessage) else ZIO.unit
},
)
}
}

Expand Down Expand Up @@ -112,9 +138,9 @@ sealed trait HttpContentCodec[A] { self =>

private[http] def chooseFirstOrDefault(
mediaTypes: Chunk[MediaTypeWithQFactor],
): (MediaType, BinaryCodecWithSchema[A]) =
): Either[UnsupportedMediaTypeError, (MediaType, BinaryCodecWithSchema[A])] =
if (mediaTypes.isEmpty) {
(defaultMediaType, defaultBinaryCodecWithSchema)
Right((defaultMediaType, defaultBinaryCodecWithSchema))
} else {
var i = 0
var result: (MediaType, BinaryCodecWithSchema[A]) = null
Expand All @@ -124,8 +150,10 @@ sealed trait HttpContentCodec[A] { self =>
if (lookupResult.isDefined) result = lookupResult.get
i += 1
}
if (result == null) (defaultMediaType, defaultBinaryCodecWithSchema)
else result
if (result == null) {
ZIO.logWarning(s"Unsupported media type: ${mediaTypes.head.mediaType}")
Right((defaultMediaType, defaultBinaryCodecWithSchema))
} else Right(result)
}

def lookup(mediaType: MediaType): Option[(MediaType, BinaryCodecWithSchema[A])]
Expand Down Expand Up @@ -180,6 +208,15 @@ sealed trait HttpContentCodec[A] { self =>

}

sealed trait CodecError extends Throwable
case class UnsupportedMediaTypeError(mediaType: MediaType) extends CodecError {
override def getMessage: String = s"Unsupported media type: $mediaType"
}

case class CodecDecodeError(details: String) extends CodecError {
override def getMessage: String = s"Codec decode error: $details"
}

object HttpContentCodec {
final case class Choices[A](
choices: ListMap[MediaType, BinaryCodecWithSchema[A]],
Expand Down

0 comments on commit 6599188

Please sign in to comment.