normalizePercentEncoding function

String normalizePercentEncoding(
  1. String input
)

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();
}