parseLinkHeader function
Parses a Link header field value into its entries.
Splits on commas that are outside angle brackets and quoted strings, since a URL may contain a comma and so may a quoted parameter — splitting on every comma is the obvious implementation and the wrong one.
Implementation
List<DVEarlyHintLink> parseLinkHeader(String value) {
final entries = <DVEarlyHintLink>[];
for (final entry in _splitTopLevel(value, ',')) {
final trimmed = entry.trim();
if (trimmed.isEmpty) continue;
final open = trimmed.indexOf('<');
final close = trimmed.indexOf('>', open + 1);
if (open != 0 || close < 0) continue;
final uri = trimmed.substring(1, close);
if (uri.isEmpty) continue;
var rel = '';
String? asType;
final parameters = <String, String>{};
for (final part in _splitTopLevel(trimmed.substring(close + 1), ';')) {
final piece = part.trim();
if (piece.isEmpty) continue;
final eq = piece.indexOf('=');
if (eq < 0) continue;
final key = piece.substring(0, eq).trim().toLowerCase();
var raw = piece.substring(eq + 1).trim();
if (raw.length >= 2 && raw.startsWith('"') && raw.endsWith('"')) {
raw = raw.substring(1, raw.length - 1);
}
switch (key) {
case 'rel':
rel = raw;
case 'as':
asType = raw;
default:
parameters[key] = raw;
}
}
if (rel.isEmpty) continue;
entries.add(DVEarlyHintLink(
uri: uri,
rel: rel,
asType: asType,
parameters: Map<String, String>.unmodifiable(parameters),
));
}
return List<DVEarlyHintLink>.unmodifiable(entries);
}