diff --git a/server/src/web.rs b/server/src/web.rs index 50bb6c2..d7fb0df 100644 --- a/server/src/web.rs +++ b/server/src/web.rs @@ -1,10 +1,12 @@ use std::convert::Infallible; +use std::error::Error; use std::sync::Arc; use warp::{Filter, Rejection, Reply}; +use warp::body::BodyDeserializeError; use warp::filters::BoxedFilter; use warp::http::StatusCode; -use warp::reject::Reject; +use warp::reject::{MethodNotAllowed, Reject}; use crate::State; @@ -79,7 +81,13 @@ pub struct AnyhowRejection(anyhow::Error); impl Reject for AnyhowRejection {} async fn handle_rejection(err: Rejection) -> Result { - let (status, name, desc) = if let Some(AnyhowRejection(e)) = err.find::() { + let (status, name, desc) = if err.is_not_found() { + (StatusCode::NOT_FOUND, "not_found", "route was unknown to the server") + } else if let Some(e) = err.find::() { + (StatusCode::BAD_REQUEST, "invalid_body", format!("invalid body: {}", e)) + } else if let Some(_) = err.find::() { + (StatusCode::METHOD_NOT_ALLOWED, "method_not_allowed", "that http method is not allowed on that route") + } else if let Some(AnyhowRejection(e)) = err.find::() { eprintln!("{:#?}", e); ( StatusCode::INTERNAL_SERVER_ERROR,