generateCacheKey static method

String generateCacheKey({
  1. required String url,
  2. Map<String, String>? headers,
  3. dynamic body,
})

Generates a stable SHA-256 cache key from the request URL, selected headers, and body. Only content-type, accept, and x-* headers are included so user-agent / auth tokens don't pollute the key.

Implementation

static String generateCacheKey({
  required String url,
  Map<String, String>? headers,
  dynamic body,
}) {
  final buffer = StringBuffer(url);

  if (headers != null && headers.isNotEmpty) {
    final criticalHeaders = <String, String>{};
    for (var entry in headers.entries) {
      final key = entry.key.toLowerCase();
      if (key == 'content-type' || key == 'accept' || key.startsWith('x-')) {
        criticalHeaders[key] = entry.value;
      }
    }

    if (criticalHeaders.isNotEmpty) {
      final sorted = Map.fromEntries(
        criticalHeaders.entries.toList()
          ..sort((a, b) => a.key.compareTo(b.key)),
      );
      buffer.write('_h:');
      buffer.write(jsonEncode(sorted));
    }
  }

  if (body != null) {
    buffer.write('_b:');
    if (body is Map) {
      final sortedBody = Map.fromEntries(
        body.entries.toList()
          ..sort((a, b) => a.key.toString().compareTo(b.key.toString())),
      );
      buffer.write(jsonEncode(sortedBody));
    } else {
      buffer.write(jsonEncode(body));
    }
  }

  return sha256.convert(utf8.encode(buffer.toString())).toString();
}