parseAcceptEncoding function

Map<String, double> parseAcceptEncoding(
  1. String? value
)

Parses an Accept-Encoding header value into a map of lowercase coding names to their q value (0.0 to 1.0).

An entry with an invalid q value is ignored. If a coding is repeated, its highest q value is kept. x-gzip is taken as gzip (RFC 9110, 8.4.1.3).

Implementation

Map<String, double> parseAcceptEncoding(String? value) {
  if (value == null) return {};
  value = value.trim();
  if (value.isEmpty) return {};

  var accepted = <String, double>{};

  for (var entry in value.split(',')) {
    var parts = entry.split(';');

    var coding = normalizeContentCoding(parts[0]);
    if (coding.isEmpty) continue;

    double? q = 1.0;

    for (var i = 1; i < parts.length; ++i) {
      var param = parts[i].trim();
      var idx = param.indexOf('=');
      if (idx <= 0) continue;

      var key = param.substring(0, idx).trim().toLowerCase();
      if (key != 'q') continue;

      q = double.tryParse(param.substring(idx + 1).trim());
      break;
    }

    if (q == null || q.isNaN) continue;
    q = q.clamp(0.0, 1.0);

    var prev = accepted[coding];
    if (prev == null || q > prev) {
      accepted[coding] = q;
    }
  }

  return accepted;
}