parseAcceptEncoding function
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;
}