From 9c0b28ffdc813ab10f9262c4f6b6c25c4dbdf323 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Tue, 7 Feb 2023 15:44:34 +0000 Subject: [PATCH] Fix StringIndexOutOfBoundsException Closes gh-29588 --- .../springframework/mock/web/MockHttpServletRequest.java | 3 ++- .../mock/web/MockHttpServletRequestTests.java | 9 +++++++++ .../web/testfixture/servlet/MockHttpServletRequest.java | 3 ++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java index 7592528b62..f1d54c4d3a 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java @@ -488,7 +488,8 @@ public class MockHttpServletRequest implements HttpServletRequest { } catch (IllegalArgumentException ex) { // Try to get charset value anyway - int charsetIndex = contentType.toLowerCase().indexOf(CHARSET_PREFIX); + contentType = contentType.toLowerCase(); + int charsetIndex = contentType.indexOf(CHARSET_PREFIX); if (charsetIndex != -1) { this.characterEncoding = contentType.substring(charsetIndex + CHARSET_PREFIX.length()); } diff --git a/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java b/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java index 3015d43c4f..f2713d2618 100644 --- a/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java +++ b/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java @@ -185,6 +185,15 @@ class MockHttpServletRequestTests { assertThat(request.getCharacterEncoding()).isEqualTo("UTF-8"); } + @Test // gh-29255 + void setContentTypeInvalidWithNonAsciiCharacterAndCharset() { + String contentType = "İcharset="; + request.addHeader(HttpHeaders.CONTENT_TYPE, contentType); + assertThat(request.getContentType()).isEqualTo(contentType); + assertThat(request.getHeader(HttpHeaders.CONTENT_TYPE)).isEqualTo(contentType); + assertThat(request.getCharacterEncoding()).isEqualTo(""); + } + @Test void contentTypeHeader() { String contentType = "test/plain"; diff --git a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletRequest.java b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletRequest.java index 74e1982bb3..065c37bf3a 100644 --- a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletRequest.java +++ b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletRequest.java @@ -488,7 +488,8 @@ public class MockHttpServletRequest implements HttpServletRequest { } catch (IllegalArgumentException ex) { // Try to get charset value anyway - int charsetIndex = contentType.toLowerCase().indexOf(CHARSET_PREFIX); + contentType = contentType.toLowerCase(); + int charsetIndex = contentType.indexOf(CHARSET_PREFIX); if (charsetIndex != -1) { this.characterEncoding = contentType.substring(charsetIndex + CHARSET_PREFIX.length()); }