diff options
author | Kornel <kornel@geekhood.net> | 2020-02-29 15:35:36 +0000 |
---|---|---|
committer | Kornel <kornel@geekhood.net> | 2020-02-29 15:35:48 +0000 |
commit | 7a37ed496630ae191b497b9508e19fd4228eb972 (patch) | |
tree | 548044a9069aeac52fea2aa37979aeca322fb965 | |
parent | 88636d9df2a663f702e00bb4efcc447a929452de (diff) |
Etag
-rw-r--r-- | server/Cargo.toml | 4 | ||||
-rw-r--r-- | server/src/main.rs | 10 |
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)); }) |