defineContentEncodingHeaders function

void defineContentEncodingHeaders(
  1. Map<String, dynamic> headers, {
  2. required APIContentEncoding encoding,
  3. required int bodyLength,
  4. required int compressedBodyLength,
  5. int? compressionCapacity,
  6. String? currentServerTiming,
  7. bool addCompressionRatioHeader = true,
  8. bool addServerTiming = true,
  9. DateTime? initTime,
  10. required String serverTimingEntryName,
})

Sets the Content-Encoding and Content-Length headers in headers for a body compressed with encoding. Optionally adds:

  • X-Compression-Ratio: with detailed compression info (ratio (compressed/body) or ratio (compressed/body/capacity)).
  • Server-Timing: duration of the compression step (if initTime is provided), appended to currentServerTiming (or to the current server-timing entry in headers).

Implementation

void defineContentEncodingHeaders(
  Map<String, dynamic> headers, {
  required APIContentEncoding encoding,
  required int bodyLength,
  required int compressedBodyLength,
  int? compressionCapacity,
  String? currentServerTiming,
  bool addCompressionRatioHeader = true,
  bool addServerTiming = true,
  DateTime? initTime,
  required String serverTimingEntryName,
}) {
  headers[HttpHeaders.contentEncodingHeader] = encoding.headerValue;
  headers[HttpHeaders.contentLengthHeader] = compressedBodyLength.toString();

  if (addCompressionRatioHeader) {
    var compressionRatio = compressedBodyLength / bodyLength;

    var compressionRatioStr = '$compressionRatio';
    if (compressionRatioStr.length > 6) {
      compressionRatioStr = compressionRatio.toStringAsFixed(4);
    }

    headers['X-Compression-Ratio'] = compressionCapacity != null
        ? '$compressionRatioStr ($compressedBodyLength/$bodyLength/$compressionCapacity)'
        : '$compressionRatioStr ($compressedBodyLength/$bodyLength)';
  }

  if (addServerTiming && initTime != null) {
    const headerServerTiming = 'server-timing';

    var time = DateTime.now().difference(initTime);
    var dur = time.inMicroseconds / 1000;

    var serverTiming2 = StringBuffer();

    var serverTiming =
        currentServerTiming ?? headers[headerServerTiming]?.toString();
    if (serverTiming != null && serverTiming.isNotEmpty) {
      serverTiming2.write(serverTiming);
      serverTiming2.write(',');
    }

    serverTiming2.write(serverTimingEntryName);
    serverTiming2.write(';dur=');
    serverTiming2.write(dur);

    headers[headerServerTiming] = serverTiming2.toString();
  }
}