Add our own HTTP date formatter

This commit is contained in:
Jake Howard 2021-12-29 16:17:38 +00:00
parent 248e7dabc2
commit 690d0ed1bb
No known key found for this signature in database
GPG Key ID: 57AFB45680EDD477
3 changed files with 15 additions and 6 deletions

1
Cargo.lock generated
View File

@ -3295,7 +3295,6 @@ dependencies = [
"governor", "governor",
"handlebars", "handlebars",
"html5ever", "html5ever",
"httpdate",
"idna 0.2.3", "idna 0.2.3",
"job_scheduler", "job_scheduler",
"jsonwebtoken", "jsonwebtoken",

View File

@ -80,7 +80,6 @@ uuid = { version = "0.8.2", features = ["v4"] }
chrono = { version = "0.4.19", features = ["serde"] } chrono = { version = "0.4.19", features = ["serde"] }
chrono-tz = "0.6.1" chrono-tz = "0.6.1"
time = "0.2.27" time = "0.2.27"
httpdate = "1.0"
# Job scheduler # Job scheduler
job_scheduler = "1.2.1" job_scheduler = "1.2.1"

View File

@ -11,9 +11,8 @@ use rocket::{
Data, Request, Response, Rocket, Data, Request, Response, Rocket,
}; };
use httpdate::HttpDate;
use std::thread::sleep; use std::thread::sleep;
use std::time::{Duration, SystemTime}; use std::time::Duration;
use crate::CONFIG; use crate::CONFIG;
@ -143,12 +142,13 @@ impl<'r, R: Responder<'r>> Responder<'r> for Cached<R> {
format!("public, max-age={}", self.ttl) format!("public, max-age={}", self.ttl)
}; };
let time_now = SystemTime::now(); let time_now = chrono::Local::now();
match self.response.respond_to(req) { match self.response.respond_to(req) {
Ok(mut res) => { Ok(mut res) => {
res.set_raw_header("Cache-Control", cache_control_header); res.set_raw_header("Cache-Control", cache_control_header);
res.set_raw_header("Expires", HttpDate::from(time_now + Duration::from_secs(self.ttl)).to_string()); let expiry_time = time_now + chrono::Duration::seconds(self.ttl.try_into().unwrap());
res.set_raw_header("Expires", format_datetime_http(&expiry_time));
Ok(res) Ok(res)
} }
e @ Err(_) => e, e @ Err(_) => e,
@ -436,6 +436,17 @@ pub fn format_naive_datetime_local(dt: &NaiveDateTime, fmt: &str) -> String {
format_datetime_local(&Local.from_utc_datetime(dt), fmt) format_datetime_local(&Local.from_utc_datetime(dt), fmt)
} }
/// Formats a `DateTime<Local>` as required for HTTP
///
/// https://httpwg.org/specs/rfc7231.html#http.date
pub fn format_datetime_http(dt: &DateTime<Local>) -> String {
let expiry_time: chrono::DateTime<chrono::Utc> = chrono::DateTime::from_utc(dt.naive_utc(), chrono::Utc);
// HACK: HTTP expects the date to always be GMT (UTC) rather than giving an
// offset (which would always be 0 in UTC anyway)
return expiry_time.to_rfc2822().replace("+0000", "GMT");
}
// //
// Deployment environment methods // Deployment environment methods
// //