From 8a72e55106af92fbbb86912633e228ad35c7fbd1 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Fri, 3 May 2024 12:29:41 -0700 Subject: [PATCH] Fix UriPathEncoder bug to improve performance Fix `isAllowed` check and write test to ensure that additional object instances are not created unnecessarily. See gh-40615 --- .../boot/loader/nio/file/UriPathEncoder.java | 2 +- .../boot/loader/nio/file/UriPathEncoderTests.java | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/nio/file/UriPathEncoder.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/nio/file/UriPathEncoder.java index ac2ab05830b..a58f252a6f4 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/nio/file/UriPathEncoder.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/nio/file/UriPathEncoder.java @@ -36,7 +36,7 @@ final class UriPathEncoder { static String encode(String path) { byte[] bytes = path.getBytes(StandardCharsets.UTF_8); for (byte b : bytes) { - if (isAllowed(b)) { + if (!isAllowed(b)) { return encode(bytes); } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/nio/file/UriPathEncoderTests.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/nio/file/UriPathEncoderTests.java index e0d7179105e..dd88e15182b 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/nio/file/UriPathEncoderTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/nio/file/UriPathEncoderTests.java @@ -34,4 +34,10 @@ class UriPathEncoderTests { assertThat(UriPathEncoder.encode("/Z\u00fcrich")).isEqualTo("/Z%C3%BCrich"); } + @Test + void encodePathWhenNoEncodingIsRequiredReturnsSameInstance() { + String path = "/foo/bar"; + assertThat(UriPathEncoder.encode(path)).isSameAs(path); + } + }