diff options
author | Quentin <quentin@deuxfleurs.fr> | 2020-11-11 11:13:31 +0100 |
---|---|---|
committer | Quentin <quentin@deuxfleurs.fr> | 2020-11-11 11:13:31 +0100 |
commit | f01006a1f954cecb23085ceac5ec28f165a6f0d7 (patch) | |
tree | 55fb0b75e3398c670c3860045075cf04b267377b | |
parent | 54166d2a09f488bff080469160d4df6a78db1a3f (diff) | |
download | garage-f01006a1f954cecb23085ceac5ec28f165a6f0d7.tar.gz garage-f01006a1f954cecb23085ceac5ec28f165a6f0d7.zip |
Extract a helper to handle errors
-rw-r--r-- | Cargo.lock | 1 | ||||
-rw-r--r-- | src/api/api_server.rs | 29 | ||||
-rw-r--r-- | src/api/helpers.rs | 27 | ||||
-rw-r--r-- | src/api/lib.rs | 1 |
4 files changed, 37 insertions, 21 deletions
@@ -429,7 +429,6 @@ dependencies = [ "bytes 0.4.12", "chrono", "crypto-mac", - "err-derive", "futures", "futures-util", "garage_model 0.1.1", diff --git a/src/api/api_server.rs b/src/api/api_server.rs index 9dc74dac..93bed8bb 100644 --- a/src/api/api_server.rs +++ b/src/api/api_server.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use std::net::SocketAddr; use std::sync::Arc; +use std::convert::Infallible; use futures::future::Future; use hyper::server::conn::AddrStream; @@ -18,6 +19,7 @@ use crate::s3_delete::*; use crate::s3_get::*; use crate::s3_list::*; use crate::s3_put::*; +use crate::helpers::*; pub async fn run_api_server( garage: Arc<Garage>, @@ -45,29 +47,16 @@ pub async fn run_api_server( Ok(()) } -async fn handler( - garage: Arc<Garage>, - req: Request<Body>, - addr: SocketAddr, -) -> Result<Response<Body>, Error> { - info!("{} {} {}", addr, req.method(), req.uri()); +async fn handler(garage: Arc<Garage>, req: Request<Body>, client_addr: SocketAddr) -> Result<Response<Body>, Infallible> { + info!("{} {} {}", client_addr, req.method(), req.uri()); debug!("{:?}", req); - match handler_inner(garage, req).await { - Ok(x) => { - debug!("{} {:?}", x.status(), x.headers()); - Ok(x) - } - Err(e) => { - let body: Body = Body::from(format!("{}\n", e)); - let mut http_error = Response::new(body); - *http_error.status_mut() = e.http_status_code(); - warn!("Response: error {}, {}", e.http_status_code(), e); - Ok(http_error) - } - } + + controller(garage, req) + .await + .make_infallible() } -async fn handler_inner(garage: Arc<Garage>, req: Request<Body>) -> Result<Response<Body>, Error> { +async fn controller(garage: Arc<Garage>, req: Request<Body>) -> Result<Response<Body>, Error> { let path = req.uri().path().to_string(); let path = percent_encoding::percent_decode_str(&path).decode_utf8()?; diff --git a/src/api/helpers.rs b/src/api/helpers.rs new file mode 100644 index 00000000..19018151 --- /dev/null +++ b/src/api/helpers.rs @@ -0,0 +1,27 @@ +use std::convert::Infallible; +use std::net::SocketAddr; +use hyper::{Body, Response}; + +use garage_util::error::Error; + +pub trait InfallibleResult { + fn make_infallible(self) -> Result<Response<Body>, Infallible>; +} + +impl InfallibleResult for Result<Response<Body>, Error> { + fn make_infallible(self) -> Result<Response<Body>, Infallible> { + match self { + Ok(x) => { + debug!("{} {:?}", x.status(), x.headers()); + Ok(x) + }, + Err(e) => { + let body: Body = Body::from(format!("{}\n", e)); + let mut http_error = Response::new(body); + *http_error.status_mut() = e.http_status_code(); + warn!("Response: error {}, {}", e.http_status_code(), e); + Ok(http_error) + } + } + } +} diff --git a/src/api/lib.rs b/src/api/lib.rs index df2fd045..003780c1 100644 --- a/src/api/lib.rs +++ b/src/api/lib.rs @@ -11,3 +11,4 @@ pub mod s3_delete; pub mod s3_get; pub mod s3_list; pub mod s3_put; +pub mod helpers; |