maintenance: return 503 on maintenance, and plain error msg on api requests

This commit is contained in:
Vincent Breitmoser 2019-06-22 16:53:21 +02:00
parent 5b3fe5ed1f
commit dceffa6d9e
No known key found for this signature in database
GPG Key ID: 7BD18320DEADFA11
2 changed files with 31 additions and 11 deletions

View File

@ -30,11 +30,17 @@ impl Fairing for MaintenanceMode {
}
fn on_request(&self, request: &mut Request, _: &Data) {
if !self.is_relevant_path(request.uri().path()) {
return;
}
if let Some(message) = self.get_maintenance_message() {
request.set_uri(uri!(maintenance_error: message));
let message = match self.get_maintenance_message() {
Some(message) => message,
None => return,
};
let path = request.uri().path();
if self.is_relevant_path_api(path) || request.method() == Method::Put {
request.set_uri(uri!(maintenance_error_api: message));
request.set_method(Method::Get);
} else if self.is_relevant_path_web(path) {
request.set_uri(uri!(maintenance_error_web: message));
request.set_method(Method::Get);
}
}
@ -45,9 +51,13 @@ impl MaintenanceMode {
MaintenanceMode { maintenance_file }
}
fn is_relevant_path(&self, path: &str) -> bool {
fn is_relevant_path_api(&self, path: &str) -> bool {
path.starts_with("/vks/v1/upload") ||
path.starts_with("/upload") ||
path.starts_with("/pks/add")
}
fn is_relevant_path_web(&self, path: &str) -> bool {
path.starts_with("/upload") ||
path.starts_with("/manage") ||
path.starts_with("/verify")
}
@ -60,12 +70,17 @@ impl MaintenanceMode {
}
}
#[get("/maintenance/<message>")]
pub fn maintenance_error(message: String) -> MyResponse {
#[get("/maintenance/api/<message>")]
pub fn maintenance_error_api(message: String) -> MyResponse {
MyResponse::MaintenancePlain(message)
}
#[get("/maintenance/web/<message>")]
pub fn maintenance_error_web(message: String) -> MyResponse {
let ctx = templates::MaintenanceMode{
message,
version: env!("VERGEN_SEMVER").to_string(),
commit: env!("VERGEN_SHA_SHORT").to_string(),
};
MyResponse::ServerError(Template::render("maintenance", ctx))
MyResponse::Maintenance(Template::render("maintenance", ctx))
}

View File

@ -51,6 +51,10 @@ pub enum MyResponse {
BadRequest(Template),
#[response(status = 400, content_type = "html")]
BadRequestPlain(String),
#[response(status = 503, content_type = "html")]
Maintenance(Template),
#[response(status = 503, content_type = "plain")]
MaintenancePlain(String),
}
impl MyResponse {
@ -311,7 +315,8 @@ fn rocket_factory(rocket: rocket::Rocket) -> Result<rocket::Rocket> {
manage::vks_manage_post,
manage::vks_manage_unpublish,
// Maintenance error page
maintenance::maintenance_error,
maintenance::maintenance_error_api,
maintenance::maintenance_error_web,
];
let db_service = configure_db_service(rocket.config())?;