parseQueryString function

Map<String, Object?> parseQueryString(
  1. String query, {
  2. int maxDepth = 32,
})

Parses a query string (or form body) the way PHP's parse_str fills Laravel's input: a[]=1&a[]=2 is a list, f[status]=x a map, keys nest up to maxDepth levels, and a repeated plain key keeps its last value. Maps whose keys are exactly 0..n-1 become lists, as in Laravel's JSON.

Implementation

Map<String, Object?> parseQueryString(String query, {int maxDepth = 32}) {
  final pairs = <(String, Object)>[];
  for (final pair in query.split('&')) {
    if (pair.isEmpty) {
      continue;
    }
    final equals = pair.indexOf('=');
    final String key;
    final String value;
    try {
      key = Uri.decodeQueryComponent(
        equals == -1 ? pair : pair.substring(0, equals),
      );
      value = equals == -1
          ? ''
          : Uri.decodeQueryComponent(pair.substring(equals + 1));
    } on ArgumentError {
      continue; // Malformed percent-encoding: PHP drops it too.
    }
    pairs.add((key, value));
  }
  return buildInput(pairs, maxDepth: maxDepth);
}