v0.34.0_p1
This commit is contained in:
1 parent
00f29f92c8
commit
0a8bc6f040
21 files changed
+672
-144
No files matched your search
Vendored
+18
-15
@@ -137,26 +137,29 @@ pub fn plan(
|
||||
} else {
|
||||
None
|
||||
};
|
||||
// Keep the freshness lifetime separate from validator/stale retention.
|
||||
// `no-cache` may be stored with a zero freshness lifetime but must validate
|
||||
// every reuse; it is retained by the bounded revalidation horizon.
|
||||
let ttl = match declared_ttl {
|
||||
Some(value) => value.min(settings.max_ttl_seconds),
|
||||
None if requires_revalidation => 0,
|
||||
None => return None,
|
||||
};
|
||||
let age = match headers.get("age") {
|
||||
Some(v) => v.to_str().ok()?.parse::<u64>().ok()?,
|
||||
None => 0,
|
||||
};
|
||||
// Keep sub-second precision internally and floor only when serializing the
|
||||
// Age header. RFC 9111 adds response delay after correcting received age.
|
||||
// RFC 9111 Section 4.2.3: the corrected initial age is the greater of
|
||||
// the Date-derived apparent age and the received Age plus response delay.
|
||||
// An upstream/CDN Age must be preserved on both transformed and normal HITs.
|
||||
let apparent_age = now.duration_since(date).unwrap_or_default();
|
||||
// RFC 9111 current_age: corrected_received_age is the greater of Date-based
|
||||
// apparent age and the received Age value; response delay is then added to
|
||||
// that result (not only to the Age branch).
|
||||
let corrected_received_age = apparent_age.max(Duration::from_secs(age));
|
||||
let initial_age = corrected_received_age.saturating_add(response_delay);
|
||||
let corrected_age_value = Duration::from_secs(age).saturating_add(response_delay);
|
||||
let initial_age = apparent_age.max(corrected_age_value);
|
||||
|
||||
// `ttl` is an absolute freshness lifetime (measured from the origin's
|
||||
// Age clock), not the time since insertion into our HOT/COLD cache.
|
||||
// Capping it directly to max_ttl_seconds makes an otherwise fresh 30-day
|
||||
// upstream response with Age=18 days look expired when our own cap is 1 day.
|
||||
// Limit the REMAINING freshness from admission, but preserve the Age clock.
|
||||
// Origin freshness still wins: an origin response that has already expired
|
||||
// must never become fresh here. `no-cache` continues to require validation.
|
||||
let ttl = match declared_ttl {
|
||||
Some(value) => value.min(initial_age.as_secs().saturating_add(settings.max_ttl_seconds)),
|
||||
None if requires_revalidation => 0,
|
||||
None => return None,
|
||||
};
|
||||
if !requires_revalidation
|
||||
&& initial_age.as_secs()
|
||||
>= retention_deadline(
|
||||
|
||||
Reference in new issue
Block a user