parseLinkHeader function

List<DVEarlyHintLink> parseLinkHeader(
  1. String value
)

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