in commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/UriParser.java [78:120]
public static void canonicalizePath(final StringBuilder buffer, final int offset, final int length,
final FileNameParser fileNameParser) throws FileSystemException {
int index = offset;
int count = length;
for (; count > 0; count--, index++) {
final char ch = buffer.charAt(index);
if (ch == '%') {
if (count < 3) {
throw new FileSystemException("vfs.provider/invalid-escape-sequence.error",
buffer.substring(index, index + count));
}
// Decode
final int dig1 = Character.digit(buffer.charAt(index + 1), HEX_BASE);
final int dig2 = Character.digit(buffer.charAt(index + 2), HEX_BASE);
if (dig1 == -1 || dig2 == -1) {
throw new FileSystemException("vfs.provider/invalid-escape-sequence.error",
buffer.substring(index, index + 3));
}
final char value = (char) (dig1 << BITS_IN_HALF_BYTE | dig2);
final boolean match = value == '%' || fileNameParser.encodeCharacter(value);
if (match) {
// this is a reserved character, not allowed to decode
index += 2;
count -= 2;
continue;
}
// Replace
buffer.setCharAt(index, value);
buffer.delete(index + 1, index + 3);
count -= 2;
} else if (fileNameParser.encodeCharacter(ch)) {
// Encode
final char[] digits = {Character.forDigit(ch >> BITS_IN_HALF_BYTE & LOW_MASK, HEX_BASE), Character.forDigit(ch & LOW_MASK, HEX_BASE)};
buffer.setCharAt(index, '%');
buffer.insert(index + 1, digits);
index += 2;
}
}
}