Files
packages.dart/experimental/http_get_cache/lib/src/cache_control.dart
T
2026-01-20 23:18:39 -08:00

57 lines
2.2 KiB
Dart

import 'package:collection/collection.dart';
// Clear-Site-Data: cache can be used to clear every stored response for a site in the browser cache, so use this with care. Note that this will not affected shared or intermediate caches.
class CacheControl {
final String value;
CacheControl(this.value);
Iterable<(String, String?)> get parts => value.split(',').map((e) {
final p = e.split('=').map((e) => e.trim()).toList();
return (p.first, p.length > 1 ? p.last : null);
});
int _getSeconds(String key, [bool allowBool = false]) {
final part = parts.firstWhereOrNull((e) {
return e.$1.toLowerCase() == key.toLowerCase();
});
final val = int.tryParse(part?.$2 ?? '');
if (val != null) return val;
if (allowBool && _getBool(key)) return double.minPositive.toInt();
return 0;
}
bool _getBool(String key) {
return parts.any((e) => e.$1.toLowerCase() == key.toLowerCase());
}
(int, bool) _getMixed(String key) => (_getSeconds(key), _getBool(key));
}
class RequestCacheControl extends CacheControl {
RequestCacheControl(super.value);
int get maxAge => _getSeconds('max-age');
int get maxStale => _getSeconds('max-stale');
int get minFresh => _getSeconds('min-fresh');
bool get noCache => _getBool('no-cache');
bool get noStore => _getBool('no-store');
bool get noTransform => _getBool('no-transform');
bool get onlyIfCached => _getBool('only-of-cached');
(int, bool) get staleIfError => _getMixed('stale-if-error');
}
class ResponseCacheControl extends CacheControl {
ResponseCacheControl(super.value);
int get maxAge => _getSeconds('max-age');
int get sMaxAge => _getSeconds('s-maxage');
bool get noCache => _getBool('no-cache');
bool get noStore => _getBool('no-store');
bool get noTransform => _getBool('no-transform');
bool get mustRevalidate => _getBool('must-revalidate');
bool get mustUnderstand => _getBool('must-understand');
bool get private => _getBool('private');
bool get public => _getBool('public');
bool get immutable => _getBool('immutable');
(int, bool) get staleWhileRevalidate => _getMixed('stale-while-revalidate');
(int, bool) get staleIfError => _getMixed('stale-if-error');
}