aboutsummaryrefslogtreecommitdiffstats
path: root/teleterm
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-12-18 03:35:49 -0500
committerJesse Luehrs <doy@tozt.net>2019-12-18 03:35:49 -0500
commitf4774473fdf109383b8e908be3d500e6d67151d4 (patch)
treee86b6dd94fdd4741fc53d4686bc1b40b893f3f16 /teleterm
parent9217c907dd2d0862551f652aa02ca186b7c637c0 (diff)
downloadteleterm-f4774473fdf109383b8e908be3d500e6d67151d4.tar.gz
teleterm-f4774473fdf109383b8e908be3d500e6d67151d4.zip
just return a future from the handler function
Diffstat (limited to 'teleterm')
-rw-r--r--teleterm/src/web/login.rs78
1 files changed, 51 insertions, 27 deletions
diff --git a/teleterm/src/web/login.rs b/teleterm/src/web/login.rs
index 0f082e1..f2af2e6 100644
--- a/teleterm/src/web/login.rs
+++ b/teleterm/src/web/login.rs
@@ -1,5 +1,6 @@
use crate::prelude::*;
+use gotham::handler::IntoHandlerError as _;
use gotham::state::FromState as _;
#[derive(
@@ -18,7 +19,12 @@ struct Response {
pub fn run(
mut state: gotham::state::State,
-) -> (gotham::state::State, hyper::Response<hyper::Body>) {
+) -> Box<
+ dyn futures::Future<
+ Item = (gotham::state::State, hyper::Response<hyper::Body>),
+ Error = (gotham::state::State, gotham::handler::HandlerError),
+ > + Send,
+> {
let username = {
let query_params = QueryParams::borrow_from(&state);
query_params.username.clone()
@@ -50,33 +56,51 @@ pub fn run(
.map_err(|e| log::error!("error logging in: {}", e)),
);
- let session = gotham::middleware::session::SessionData::<
- crate::web::SessionData,
- >::borrow_mut_from(&mut state);
-
- match r_login.wait().unwrap() {
- Ok(login) => {
- session.login = Some(login);
- }
- Err(e) => {
- session.login = None;
- log::error!("error logging in: {}", e);
- return (
- state,
- hyper::Response::builder()
- .status(hyper::StatusCode::INTERNAL_SERVER_ERROR)
- .body(hyper::Body::empty())
- .unwrap(),
- );
+ Box::new(r_login.then(|res| {
+ let session = gotham::middleware::session::SessionData::<
+ crate::web::SessionData,
+ >::borrow_mut_from(&mut state);
+ match res {
+ Ok(login) => {
+ let session = gotham::middleware::session::SessionData::<
+ crate::web::SessionData,
+ >::borrow_mut_from(&mut state);
+
+ match login {
+ Ok(login) => {
+ session.login = Some(login);
+ futures::future::ok((
+ state,
+ hyper::Response::new(hyper::Body::from(
+ serde_json::to_string(&Response { username })
+ .unwrap(),
+ )),
+ ))
+ }
+ Err(e) => {
+ session.login = None;
+ log::error!("error logging in: {}", e);
+ futures::future::err((
+ state,
+ e.into_handler_error().with_status(
+ hyper::StatusCode::INTERNAL_SERVER_ERROR,
+ ),
+ ))
+ }
+ }
+ }
+ Err(e) => {
+ session.login = None;
+ log::error!("error logging in: {}", e);
+ futures::future::err((
+ state,
+ e.into_handler_error().with_status(
+ hyper::StatusCode::INTERNAL_SERVER_ERROR,
+ ),
+ ))
+ }
}
- }
-
- (
- state,
- hyper::Response::new(hyper::Body::from(
- serde_json::to_string(&Response { username }).unwrap(),
- )),
- )
+ }))
}
pub(crate) struct Client<