Inline RestUtils#decodeComponent

Relates #16725
This commit is contained in:
Jason Tedor 2016-02-13 07:56:31 -05:00
parent e39280b5a6
commit b9a7db554a
1 changed files with 23 additions and 15 deletions

View File

@ -142,13 +142,22 @@ public class RestUtils {
* @throws IllegalArgumentException if the string contains a malformed
* escape sequence.
*/
@SuppressWarnings("fallthrough")
public static String decodeComponent(final String s, final Charset charset) {
if (s == null) {
return "";
}
final int size = s.length();
boolean modified = false;
if (!decodingNeeded(s, size)) {
return s;
}
final byte[] buf = new byte[size];
int pos = decode(s, size, buf);
return new String(buf, 0, pos, charset);
}
@SuppressWarnings("fallthrough")
private static boolean decodingNeeded(String s, int size) {
boolean decodingNeeded = false;
for (int i = 0; i < size; i++) {
final char c = s.charAt(i);
switch (c) {
@ -156,14 +165,15 @@ public class RestUtils {
i++; // We can skip at least one char, e.g. `%%'.
// Fall through.
case '+':
modified = true;
decodingNeeded = true;
break;
}
}
if (!modified) {
return s;
}
final byte[] buf = new byte[size];
return decodingNeeded;
}
@SuppressWarnings("fallthrough")
private static int decode(String s, int size, byte[] buf) {
int pos = 0; // position in `buf'.
for (int i = 0; i < size; i++) {
char c = s.charAt(i);
@ -173,24 +183,22 @@ public class RestUtils {
break;
case '%':
if (i == size - 1) {
throw new IllegalArgumentException("unterminated escape"
+ " sequence at end of string: " + s);
throw new IllegalArgumentException("unterminated escape sequence at end of string: " + s);
}
c = s.charAt(++i);
if (c == '%') {
buf[pos++] = '%'; // "%%" -> "%"
break;
} else if (i == size - 1) {
throw new IllegalArgumentException("partial escape"
+ " sequence at end of string: " + s);
throw new IllegalArgumentException("partial escape sequence at end of string: " + s);
}
c = decodeHexNibble(c);
final char c2 = decodeHexNibble(s.charAt(++i));
if (c == Character.MAX_VALUE || c2 == Character.MAX_VALUE) {
throw new IllegalArgumentException(
"invalid escape sequence `%" + s.charAt(i - 1)
+ s.charAt(i) + "' at index " + (i - 2)
+ " of: " + s);
"invalid escape sequence `%" + s.charAt(i - 1)
+ s.charAt(i) + "' at index " + (i - 2)
+ " of: " + s);
}
c = (char) (c * 16 + c2);
// Fall through.
@ -199,7 +207,7 @@ public class RestUtils {
break;
}
}
return new String(buf, 0, pos, charset);
return pos;
}
/**