resolveCompressionEncodings static method

List<APIContentEncoding> resolveCompressionEncodings(
  1. Object? compressionEncodings, {
  2. APIConfig? apiConfig,
})

Resolves compressionEncodings (a List or a comma separated String, e.g. br,gzip), falling back to server.compression_encodings in apiConfig, then to APIContentEncoding.defaultEncodings.

  • true (or on/yes) uses the defaults.
  • An empty value, false (or none/off/no) disables the response compression.
  • Unknown encodings are ignored (logged). If none is known, the defaults are used.

Implementation

static List<APIContentEncoding> resolveCompressionEncodings(
  Object? compressionEncodings, {
  APIConfig? apiConfig,
}) {
  compressionEncodings ??= apiConfig?.getPath(
    'server',
    'compression_encodings',
  );

  if (compressionEncodings is bool) {
    return compressionEncodings
        ? APIContentEncoding.defaultEncodings
        : const <APIContentEncoding>[];
  }

  // Not defined, or enabled without a list:
  if (compressionEncodings == null ||
      _compressionEnabledValues.contains(
        compressionEncodings.toString().trim().toLowerCase(),
      )) {
    return APIContentEncoding.defaultEncodings;
  }

  var items = compressionEncodings is Iterable
      ? compressionEncodings
      : compressionEncodings.toString().split(',');

  var encodings = <APIContentEncoding>[];
  var unknown = <String>[];
  var disabled = false;

  for (var e in items) {
    var encoding = APIContentEncoding.parse(e);
    if (encoding != null) {
      if (!encodings.contains(encoding)) encodings.add(encoding);
      continue;
    }

    var name = '${e ?? ''}'.trim().toLowerCase();
    if (name.isEmpty) continue;

    if (_compressionDisabledValues.contains(name)) {
      disabled = true;
    } else {
      unknown.add(name);
    }
  }

  if (encodings.isEmpty && (disabled || unknown.isEmpty)) {
    return const <APIContentEncoding>[];
  }

  if (encodings.isEmpty) {
    _log.warning(
      "Unknown `compression_encodings`: $unknown. "
      "Using the defaults: ${APIContentEncoding.defaultEncodings.map((e) => e.name).toList()}",
    );
    return APIContentEncoding.defaultEncodings;
  } else if (unknown.isNotEmpty) {
    _log.warning("Ignoring unknown `compression_encodings`: $unknown");
  }

  return List.unmodifiable(encodings);
}