diff --git a/org.springframework.web/src/main/java/org/springframework/web/util/UriUtils.java b/org.springframework.web/src/main/java/org/springframework/web/util/UriUtils.java index 62e5aceda10..9053e790f9e 100644 --- a/org.springframework.web/src/main/java/org/springframework/web/util/UriUtils.java +++ b/org.springframework.web/src/main/java/org/springframework/web/util/UriUtils.java @@ -462,6 +462,7 @@ public abstract class UriUtils { Assert.hasLength(encoding, "'encoding' must not be empty"); int length = source.length(); ByteArrayOutputStream bos = new ByteArrayOutputStream(length); + boolean changed = false; for (int i = 0; i < length; i++) { int ch = source.charAt(i); if (ch == '%') { @@ -472,6 +473,7 @@ public abstract class UriUtils { int l = Character.digit(hex2, 16); bos.write((char) ((u << 4) + l)); i += 2; + changed = true; } else { throw new IllegalArgumentException("Invalid encoded sequence \"" + source.substring(i) + "\""); @@ -481,7 +483,7 @@ public abstract class UriUtils { bos.write(ch); } } - return new String(bos.toByteArray(), encoding); + return changed ? new String(bos.toByteArray(), encoding) : source; } } diff --git a/org.springframework.web/src/test/java/org/springframework/web/util/UriUtilsTests.java b/org.springframework.web/src/test/java/org/springframework/web/util/UriUtilsTests.java index 053c53d08bc..01de9f59d5c 100644 --- a/org.springframework.web/src/test/java/org/springframework/web/util/UriUtilsTests.java +++ b/org.springframework.web/src/test/java/org/springframework/web/util/UriUtilsTests.java @@ -88,11 +88,13 @@ public class UriUtilsTests { @Test public void decode() throws UnsupportedEncodingException { + assertEquals("Invalid encoded URI", "", UriUtils.decode("", ENC)); assertEquals("Invalid encoded URI", "foobar", UriUtils.decode("foobar", ENC)); assertEquals("Invalid encoded URI", "foo bar", UriUtils.decode("foo%20bar", ENC)); assertEquals("Invalid encoded URI", "foo+bar", UriUtils.decode("foo%2bbar", ENC)); assertEquals("Invalid encoded result", "T\u014dky\u014d", UriUtils.decode("T%C5%8Dky%C5%8D", ENC)); assertEquals("Invalid encoded result", "/Z\u00fcrich", UriUtils.decode("/Z%C3%BCrich", ENC)); + assertEquals("Invalid encoded result", "T\u014dky\u014d", UriUtils.decode("T\u014dky\u014d", ENC)); } @Test(expected = IllegalArgumentException.class)