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 a36adbf4b8..3af171ebc9 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 @@ -590,25 +590,25 @@ final class HierarchicalUriComponents extends UriComponents { AUTHORITY { @Override public boolean isAllowed(int c) { - return isUnreserved(c) || isSubDelimiter(c) || ':' == c || '@' == c; + return (isUnreservedOrSubDelimiter(c) || ':' == c || '@' == c); } }, USER_INFO { @Override public boolean isAllowed(int c) { - return isUnreserved(c) || isSubDelimiter(c) || ':' == c; + return (isUnreservedOrSubDelimiter(c) || ':' == c); } }, HOST_IPV4 { @Override public boolean isAllowed(int c) { - return isUnreserved(c) || isSubDelimiter(c); + return isUnreservedOrSubDelimiter(c); } }, HOST_IPV6 { @Override public boolean isAllowed(int c) { - return isUnreserved(c) || isSubDelimiter(c) || '[' == c || ']' == c || ':' == c; + return (isUnreservedOrSubDelimiter(c) || '[' == c || ']' == c || ':' == c); } }, PORT { @@ -620,7 +620,7 @@ final class HierarchicalUriComponents extends UriComponents { PATH { @Override public boolean isAllowed(int c) { - return isPchar(c) || '/' == c; + return (isPchar(c) || '/' == c); } }, PATH_SEGMENT { @@ -632,7 +632,7 @@ final class HierarchicalUriComponents extends UriComponents { QUERY { @Override public boolean isAllowed(int c) { - return isPchar(c) || '/' == c || '?' == c; + return (isPchar(c) || '/' == c || '?' == c); } }, QUERY_PARAM { @@ -642,14 +642,14 @@ final class HierarchicalUriComponents extends UriComponents { return false; } else { - return isPchar(c) || '/' == c || '?' == c; + return (isPchar(c) || '/' == c || '?' == c); } } }, FRAGMENT { @Override public boolean isAllowed(int c) { - return isPchar(c) || '/' == c || '?' == c; + return (isPchar(c) || '/' == c || '?' == c); } }, URI { @@ -659,6 +659,15 @@ final class HierarchicalUriComponents extends UriComponents { } }; + private static final boolean[] unreservedOrSubDelimiterArray = new boolean[128]; + + static { + for (int i = 0; i < 128; i++) { + char c = (char) i; + unreservedOrSubDelimiterArray[i] = (URI.isUnreserved(c) || URI.isSubDelimiter(c)); + } + } + /** * Indicates whether the given character is allowed in this URI component. * @return {@code true} if the character is allowed; {@code false} otherwise @@ -694,8 +703,8 @@ final class HierarchicalUriComponents extends UriComponents { * @see RFC 3986, appendix A */ protected boolean isSubDelimiter(int c) { - return ('!' == c || '$' == c || '&' == c || '\'' == c || '(' == c || ')' == c || '*' == c || '+' == c || - ',' == c || ';' == c || '=' == c); + return ('!' == c || '$' == c || '&' == c || '\'' == c || + '(' == c || ')' == c || '*' == c || '+' == c || ',' == c || ';' == c || '=' == c); } /** @@ -719,8 +728,16 @@ final class HierarchicalUriComponents extends UriComponents { * @see RFC 3986, appendix A */ protected boolean isPchar(int c) { - return (isUnreserved(c) || isSubDelimiter(c) || ':' == c || '@' == c); + return (isUnreservedOrSubDelimiter(c) || ':' == c || '@' == c); } + + /** + * Combined check whether a character is unreserved or a sub-delimiter. + */ + protected boolean isUnreservedOrSubDelimiter(int c) { + return (c < unreservedOrSubDelimiterArray.length && c >= 0 && unreservedOrSubDelimiterArray[c]); + } + }