From 3724d79a5aa08a64fc96d1683706a604adc2b0fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diogo=20Os=C3=B3rio?= Date: Fri, 28 Nov 2025 15:56:29 +0000 Subject: [PATCH 1/4] fix: handle unparseable mime-type --- .../main/java/io/sentry/spring/SentrySpringFilter.java | 9 +++++++-- .../kotlin/io/sentry/spring/SentrySpringFilterTest.kt | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/sentry-spring/src/main/java/io/sentry/spring/SentrySpringFilter.java b/sentry-spring/src/main/java/io/sentry/spring/SentrySpringFilter.java index 4d8767334ae..69438c82617 100644 --- a/sentry-spring/src/main/java/io/sentry/spring/SentrySpringFilter.java +++ b/sentry-spring/src/main/java/io/sentry/spring/SentrySpringFilter.java @@ -26,6 +26,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.springframework.http.MediaType; +import org.springframework.util.InvalidMimeTypeException; import org.springframework.util.MimeType; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.ContentCachingRequestWrapper; @@ -131,8 +132,12 @@ && shouldCacheMimeType(contentType) } private static boolean shouldCacheMimeType(String contentType) { - return MimeType.valueOf(contentType).isCompatibleWith(MediaType.APPLICATION_JSON) - || MimeType.valueOf(contentType).isCompatibleWith(MediaType.APPLICATION_FORM_URLENCODED); + try { + return MimeType.valueOf(contentType).isCompatibleWith(MediaType.APPLICATION_JSON) + || MimeType.valueOf(contentType).isCompatibleWith(MediaType.APPLICATION_FORM_URLENCODED); + } catch (InvalidMimeTypeException e) { + return false; + } } static final class RequestBodyExtractingEventProcessor implements EventProcessor { diff --git a/sentry-spring/src/test/kotlin/io/sentry/spring/SentrySpringFilterTest.kt b/sentry-spring/src/test/kotlin/io/sentry/spring/SentrySpringFilterTest.kt index 06bea9fc9de..eb145bcd8a1 100644 --- a/sentry-spring/src/test/kotlin/io/sentry/spring/SentrySpringFilterTest.kt +++ b/sentry-spring/src/test/kotlin/io/sentry/spring/SentrySpringFilterTest.kt @@ -266,6 +266,12 @@ class SentrySpringFilterTest { body = "x".repeat(10001), expectedToBeCached = false, ), + TestParams( + maxRequestBodySize = MEDIUM, + body = "xxx", + expectedToBeCached = false, + contentType = "invalid", + ), TestParams( maxRequestBodySize = ALWAYS, body = "x".repeat(10001), From 96459c5db5bdd72849001f44a121158b77ced0dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diogo=20Os=C3=B3rio?= Date: Fri, 28 Nov 2025 16:27:33 +0000 Subject: [PATCH 2/4] fix: apply same catch on sentry-spring-7 --- .../main/java/io/sentry/spring7/SentrySpringFilter.java | 9 +++++++-- .../kotlin/io/sentry/spring7/SentrySpringFilterTest.kt | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/sentry-spring-7/src/main/java/io/sentry/spring7/SentrySpringFilter.java b/sentry-spring-7/src/main/java/io/sentry/spring7/SentrySpringFilter.java index c709cebbca7..38bc4379088 100644 --- a/sentry-spring-7/src/main/java/io/sentry/spring7/SentrySpringFilter.java +++ b/sentry-spring-7/src/main/java/io/sentry/spring7/SentrySpringFilter.java @@ -26,6 +26,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.springframework.http.MediaType; +import org.springframework.util.InvalidMimeTypeException; import org.springframework.util.MimeType; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.ContentCachingRequestWrapper; @@ -131,8 +132,12 @@ && shouldCacheMimeType(contentType) } private static boolean shouldCacheMimeType(String contentType) { - return MimeType.valueOf(contentType).isCompatibleWith(MediaType.APPLICATION_JSON) - || MimeType.valueOf(contentType).isCompatibleWith(MediaType.APPLICATION_FORM_URLENCODED); + try { + return MimeType.valueOf(contentType).isCompatibleWith(MediaType.APPLICATION_JSON) + || MimeType.valueOf(contentType).isCompatibleWith(MediaType.APPLICATION_FORM_URLENCODED); + } catch (InvalidMimeTypeException e) { + return false; + } } static final class RequestBodyExtractingEventProcessor implements EventProcessor { diff --git a/sentry-spring-7/src/test/kotlin/io/sentry/spring7/SentrySpringFilterTest.kt b/sentry-spring-7/src/test/kotlin/io/sentry/spring7/SentrySpringFilterTest.kt index 639b1642a51..5a83c9d72a4 100644 --- a/sentry-spring-7/src/test/kotlin/io/sentry/spring7/SentrySpringFilterTest.kt +++ b/sentry-spring-7/src/test/kotlin/io/sentry/spring7/SentrySpringFilterTest.kt @@ -266,6 +266,12 @@ class SentrySpringFilterTest { body = "x".repeat(10001), expectedToBeCached = false, ), + TestParams( + maxRequestBodySize = MEDIUM, + body = "xxx", + expectedToBeCached = false, + contentType = "invalid", + ), TestParams( maxRequestBodySize = ALWAYS, body = "x".repeat(10001), From c306b632e9bd5e732b8f83b03b225ce84acae484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diogo=20Os=C3=B3rio?= Date: Fri, 28 Nov 2025 16:51:38 +0000 Subject: [PATCH 3/4] chore: add CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d1082fa9d2..adbc32dae87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ SentryAndroid.init( ### Fixes - Fix missing thread stacks for ANRv1 events ([#4918](https://github.com/getsentry/sentry-java/pull/4918)) +- Fix handling of unparseable mime-type on request filter ([#4939](https://github.com/getsentry/sentry-java/pull/4939)) ### Internal From aeb9fcb38cb6012069f47da15f9495f29964f776 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Mon, 1 Dec 2025 11:58:05 +0100 Subject: [PATCH 4/4] change Spring Boot 3 / Spring 6 implementation --- .../io/sentry/spring/jakarta/SentrySpringFilter.java | 9 +++++++-- .../io/sentry/spring/jakarta/SentrySpringFilterTest.kt | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentrySpringFilter.java b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentrySpringFilter.java index 34dd5f0c469..c51a2053b8d 100644 --- a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentrySpringFilter.java +++ b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentrySpringFilter.java @@ -26,6 +26,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.springframework.http.MediaType; +import org.springframework.util.InvalidMimeTypeException; import org.springframework.util.MimeType; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.ContentCachingRequestWrapper; @@ -131,8 +132,12 @@ && shouldCacheMimeType(contentType) } private static boolean shouldCacheMimeType(String contentType) { - return MimeType.valueOf(contentType).isCompatibleWith(MediaType.APPLICATION_JSON) - || MimeType.valueOf(contentType).isCompatibleWith(MediaType.APPLICATION_FORM_URLENCODED); + try { + return MimeType.valueOf(contentType).isCompatibleWith(MediaType.APPLICATION_JSON) + || MimeType.valueOf(contentType).isCompatibleWith(MediaType.APPLICATION_FORM_URLENCODED); + } catch (InvalidMimeTypeException e) { + return false; + } } static final class RequestBodyExtractingEventProcessor implements EventProcessor { diff --git a/sentry-spring-jakarta/src/test/kotlin/io/sentry/spring/jakarta/SentrySpringFilterTest.kt b/sentry-spring-jakarta/src/test/kotlin/io/sentry/spring/jakarta/SentrySpringFilterTest.kt index 6c8db2fc097..349839b5d15 100644 --- a/sentry-spring-jakarta/src/test/kotlin/io/sentry/spring/jakarta/SentrySpringFilterTest.kt +++ b/sentry-spring-jakarta/src/test/kotlin/io/sentry/spring/jakarta/SentrySpringFilterTest.kt @@ -266,6 +266,12 @@ class SentrySpringFilterTest { body = "x".repeat(10001), expectedToBeCached = false, ), + TestParams( + maxRequestBodySize = MEDIUM, + body = "xxx", + expectedToBeCached = false, + contentType = "invalid", + ), TestParams( maxRequestBodySize = ALWAYS, body = "x".repeat(10001),