summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKornel <kornel@geekhood.net>2020-02-29 15:35:36 +0000
committerKornel <kornel@geekhood.net>2020-02-29 15:35:48 +0000
commit7a37ed496630ae191b497b9508e19fd4228eb972 (patch)
tree548044a9069aeac52fea2aa37979aeca322fb965
parent88636d9df2a663f702e00bb4efcc447a929452de (diff)
Etag
-rw-r--r--server/Cargo.toml4
-rw-r--r--server/src/main.rs10
2 files changed, 12 insertions, 2 deletions
diff --git a/server/Cargo.toml b/server/Cargo.toml
index 6a0c10c..2dc2aaf 100644
--- a/server/Cargo.toml
+++ b/server/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "crates-server"
-version = "0.12.5"
+version = "0.12.6"
authors = ["Kornel <kornel@geekhood.net>"]
edition = "2018"
description = "Crates.rs web server"
@@ -39,3 +39,5 @@ actix-threadpool = "0.3.1"
either = "1.5.3"
qstring = "0.7.2"
chrono = "0.4.10"
+blake3 = { version = "0.2.2", default-features = false }
+base64 = "0.11.0"
diff --git a/server/src/main.rs b/server/src/main.rs
index df1149c..bdee41d 100644
--- a/server/src/main.rs
+++ b/server/src/main.rs
@@ -169,7 +169,7 @@ async fn run_server() -> Result<(), failure::Error> {
let server = HttpServer::new(move || {
App::new()
.app_data(state.clone())
- .wrap(middleware::DefaultHeaders::new().header("Server", HeaderValue::from_static(concat!("actix-web/2.0 lib.rs/", env!("CARGO_PKG_VERSION")))))
+ .wrap(middleware::DefaultHeaders::new().header("x-powered-by", HeaderValue::from_static(concat!("actix-web/2 lib.rs/", env!("CARGO_PKG_VERSION")))))
.wrap(middleware::Logger::default())
.route("/", web::get().to(handle_home))
.route("/search", web::get().to(handle_search))
@@ -597,8 +597,16 @@ async fn handle_keyword(req: HttpRequest) -> Result<HttpResponse, ServerError> {
fn serve_cached((page, cache_time, refresh, last_modified): (Vec<u8>, u32, bool, Option<DateTime<FixedOffset>>)) -> HttpResponse {
let err_max = (cache_time * 10).max(3600 * 24 * 2);
+
+ // last-modified is ambiguous, because it's modification of the content, not the whole state
+ let mut hasher = blake3::Hasher::new();
+ hasher.update(if refresh {b"1"} else {b"0"});
+ hasher.update(&page);
+ let etag = format!("\"{:.16}\"", base64::encode(hasher.finalize().as_bytes()));
+
HttpResponse::Ok()
.content_type("text/html;charset=UTF-8")
+ .header("etag", etag)
.if_true(!refresh, |h| {
h.header("Cache-Control", format!("public, max-age={}, stale-while-revalidate={}, stale-if-error={}", cache_time, cache_time*3, err_max));
})