Skip to content

Commit

Permalink
Fix: Mimetype application/x-zip-compressed interpreted as a text field (
Browse files Browse the repository at this point in the history
#3203)

* Fix: Treat unrecognized MIME types as binary in MediaType

* Fix: Ensure wildcard MIME types in Accept header default to non-binary

* Update unsafeParseCustomMediaType to set binary for unrecognized MIME types

---------

Co-authored-by: Nabil Abdel-Hafeez <[email protected]>
  • Loading branch information
varshith257 and 987Nabil authored Dec 14, 2024
1 parent 7db7f7f commit 1519ce6
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
10 changes: 9 additions & 1 deletion zio-http/jvm/src/test/scala/zio/http/MediaTypeSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ object MediaTypeSpec extends ZIOHttpSpec {
}
},
test("custom mime type parsing") {
assertTrue(MediaType.parseCustomMediaType("custom/mime").contains(MediaType("custom", "mime")))
assertTrue(MediaType.parseCustomMediaType("custom/mime").contains(MediaType("custom", "mime", binary = true)))
},
test("optional parameter parsing") {
assertTrue(
Expand All @@ -48,5 +48,13 @@ object MediaTypeSpec extends ZIOHttpSpec {
),
)
},
test("application/x-zip-compressed should be binary") {
val mediaType = MediaType.forContentType("application/x-zip-compressed")
assertTrue(mediaType.exists(_.binary))
},
test("text/plain should not be binary") {
val mediaType = MediaType.forContentType("text/plain")
assertTrue(mediaType.exists(!_.binary))
},
)
}
5 changes: 5 additions & 0 deletions zio-http/shared/src/main/scala/zio/http/MediaType.scala
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,14 @@ object MediaType extends MediaTypes {
val contentTypeParts = customMediaType.split('/')
if (contentTypeParts.length == 2) {
val subtypeParts = contentTypeParts(1).split(';')
// Default binary to true for unknown types unless they belong to text families
val isBinary = customMediaType != "*/*" && customMediaType != "text/*" && !customMediaType.startsWith("text/")
if (subtypeParts.length >= 1) {
Some(
MediaType(
mainType = contentTypeParts.head,
subType = subtypeParts.head,
binary = isBinary,
parameters = if (subtypeParts.length >= 2) parseOptionalParameters(subtypeParts.tail) else Map.empty,
),
)
Expand All @@ -80,10 +83,12 @@ object MediaType extends MediaTypes {
val contentTypeParts = customMediaType.split('/')
if (contentTypeParts.length == 2) {
val subtypeParts = contentTypeParts(1).split(';')
val isBinary = customMediaType != "*/*" && customMediaType != "text/*" && !customMediaType.startsWith("text/")
if (subtypeParts.length >= 1) {
MediaType(
mainType = contentTypeParts.head,
subType = subtypeParts.head,
binary = isBinary,
parameters = if (subtypeParts.length >= 2) parseOptionalParameters(subtypeParts.tail) else Map.empty,
)
} else throw new IllegalArgumentException(s"Invalid media type $customMediaType")
Expand Down

0 comments on commit 1519ce6

Please sign in to comment.