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]);
+ }
+
}