From d3626eba2abc6c76959535231b4f93a14e85dc63 Mon Sep 17 00:00:00 2001 From: Jeremy Lin Date: Sat, 4 Mar 2023 19:19:09 -0800 Subject: [PATCH] Add HEAD routes to avoid spurious error messages Rocket automatically implements a HEAD route when there's a matching GET route, but relying on this behavior also means a spurious error gets logged due to . Add explicit HEAD routes for `/` and `/alive` to prevent uptime monitoring services from generating error messages like `No matching routes for HEAD /`. With these new routes, `HEAD /` only checks that the server can respond over the network, while `HEAD /alive` also checks that the database connection is alive, similar to `GET /alive`. --- src/api/web.rs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/api/web.rs b/src/api/web.rs index 7f9a77da..f7fbeec4 100644 --- a/src/api/web.rs +++ b/src/api/web.rs @@ -4,7 +4,7 @@ use rocket::{fs::NamedFile, http::ContentType, response::content::RawHtml as Htm use serde_json::Value; use crate::{ - api::{core::now, ApiResult}, + api::{core::now, ApiResult, EmptyResult}, error::Error, util::{Cached, SafeString}, CONFIG, @@ -14,9 +14,9 @@ pub fn routes() -> Vec { // If addding more routes here, consider also adding them to // crate::utils::LOGGED_ROUTES to make sure they appear in the log if CONFIG.web_vault_enabled() { - routes![web_index, app_id, web_files, attachments, alive, static_files] + routes![web_index, web_index_head, app_id, web_files, attachments, alive, alive_head, static_files] } else { - routes![attachments, alive, static_files] + routes![attachments, alive, alive_head, static_files] } } @@ -43,6 +43,17 @@ async fn web_index() -> Cached> { Cached::short(NamedFile::open(Path::new(&CONFIG.web_vault_folder()).join("index.html")).await.ok(), false) } +#[head("/")] +fn web_index_head() -> EmptyResult { + // Add an explicit HEAD route to prevent uptime monitoring services from + // generating "No matching routes for HEAD /" error messages. + // + // Rocket automatically implements a HEAD route when there's a matching GET + // route, but relying on this behavior also means a spurious error gets + // logged due to . + Ok(()) +} + #[get("/app-id.json")] fn app_id() -> Cached<(ContentType, Json)> { let content_type = ContentType::new("application", "fido.trusted-apps+json"); @@ -92,6 +103,13 @@ fn alive(_conn: DbConn) -> Json { now() } +#[head("/alive")] +fn alive_head(_conn: DbConn) -> EmptyResult { + // Avoid logging spurious "No matching routes for HEAD /alive" errors + // due to . + Ok(()) +} + #[get("/vw_static/")] pub fn static_files(filename: String) -> Result<(ContentType, &'static [u8]), Error> { match filename.as_ref() {