From 5dbd3b0bbfdd66b8f2f478298d7732da32338597 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 9 Dec 2019 13:56:50 +0100 Subject: [PATCH] Avoid ByteArrayOutputStream for source values without the need to be encoded Closes gh-24154 --- .../web/util/HierarchicalUriComponents.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java index 96a7f8a1f8..22f13c5e9c 100644 --- a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java +++ b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java @@ -335,8 +335,21 @@ final class HierarchicalUriComponents extends UriComponents { Assert.notNull(type, "Type must not be null"); byte[] bytes = source.getBytes(charset); + boolean original = true; + for (byte b : bytes) { + if (b < 0) { + b += 256; + } + if (!type.isAllowed(b)) { + original = false; + break; + } + } + if (original) { + return source; + } + ByteArrayOutputStream bos = new ByteArrayOutputStream(bytes.length); - boolean changed = false; for (byte b : bytes) { if (b < 0) { b += 256; @@ -350,10 +363,9 @@ final class HierarchicalUriComponents extends UriComponents { char hex2 = Character.toUpperCase(Character.forDigit(b & 0xF, 16)); bos.write(hex1); bos.write(hex2); - changed = true; } } - return (changed ? new String(bos.toByteArray(), charset) : source); + return new String(bos.toByteArray(), charset); } private Type getHostType() { @@ -416,7 +428,6 @@ final class HierarchicalUriComponents extends UriComponents { @Override protected HierarchicalUriComponents expandInternal(UriTemplateVariables uriVariables) { - Assert.state(!this.encodeState.equals(EncodeState.FULLY_ENCODED), "URI components already encoded, and could not possibly contain '{' or '}'.");