normalizePercentEncoding function
RFC 3986 Section 6.2.2.2: Percent-Encoding Normalization
- Decodes percent-encoded unreserved characters (A-Z, a-z, 0-9, -, ., _, ~)
- Uppercases hex digits in remaining percent-encodings
Implementation
String normalizePercentEncoding(String input) {
final result = StringBuffer();
int i = 0;
while (i < input.length) {
if (input[i] == '%' && i + 2 < input.length) {
final hex = input.substring(i + 1, i + 3);
// Validate hex digits
if (_hexPairRegex.hasMatch(hex)) {
final charCode = int.parse(hex, radix: 16);
final char = String.fromCharCode(charCode);
// Decode if it's an unreserved character
if (_unreservedCharRegex.hasMatch(char)) {
result.write(char);
} else {
// Keep percent-encoded but uppercase the hex digits
result.write('%${hex.toUpperCase()}');
}
i += 3;
continue;
}
}
result.write(input[i]);
i++;
}
return result.toString();
}