@ -4,7 +4,7 @@ use rocket::{fs::NamedFile, http::ContentType, response::content::RawHtml as Htm
use serde_json ::Value ;
use serde_json ::Value ;
use crate ::{
use crate ::{
api ::{ core ::now , ApiResult },
api ::{ core ::now , ApiResult , EmptyResult },
error ::Error ,
error ::Error ,
util ::{ Cached , SafeString } ,
util ::{ Cached , SafeString } ,
CONFIG ,
CONFIG ,
@ -14,9 +14,9 @@ pub fn routes() -> Vec<Route> {
// If addding more routes here, consider also adding them to
// If addding more routes here, consider also adding them to
// crate::utils::LOGGED_ROUTES to make sure they appear in the log
// crate::utils::LOGGED_ROUTES to make sure they appear in the log
if CONFIG . web_vault_enabled ( ) {
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 {
} else {
routes ! [ attachments , alive , static_files]
routes ! [ attachments , alive , alive_head, static_files]
}
}
}
}
@ -43,6 +43,17 @@ async fn web_index() -> Cached<Option<NamedFile>> {
Cached ::short ( NamedFile ::open ( Path ::new ( & CONFIG . web_vault_folder ( ) ) . join ( "index.html" ) ) . await . ok ( ) , false )
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 <https://github.com/SergioBenitez/Rocket/issues/1098>.
Ok ( ( ) )
}
#[ get( " /app-id.json " ) ]
#[ get( " /app-id.json " ) ]
fn app_id ( ) -> Cached < ( ContentType , Json < Value > ) > {
fn app_id ( ) -> Cached < ( ContentType , Json < Value > ) > {
let content_type = ContentType ::new ( "application" , "fido.trusted-apps+json" ) ;
let content_type = ContentType ::new ( "application" , "fido.trusted-apps+json" ) ;
@ -92,6 +103,13 @@ fn alive(_conn: DbConn) -> Json<String> {
now ( )
now ( )
}
}
#[ head( " /alive " ) ]
fn alive_head ( _conn : DbConn ) -> EmptyResult {
// Avoid logging spurious "No matching routes for HEAD /alive" errors
// due to <https://github.com/SergioBenitez/Rocket/issues/1098>.
Ok ( ( ) )
}
#[ get( " /vw_static/<filename> " ) ]
#[ get( " /vw_static/<filename> " ) ]
pub fn static_files ( filename : String ) -> Result < ( ContentType , & ' static [ u8 ] ) , Error > {
pub fn static_files ( filename : String ) -> Result < ( ContentType , & ' static [ u8 ] ) , Error > {
match filename . as_ref ( ) {
match filename . as_ref ( ) {