From aababf37a8f6f060ca9767e00af3ad9f513a6e00 Mon Sep 17 00:00:00 2001 From: Lucien Greathouse Date: Thu, 19 Sep 2019 13:50:42 -0700 Subject: [PATCH] Catch more HTTP API errors --- src/web/api.rs | 51 +++++++++++++++++--------------------------- src/web/interface.rs | 16 ++++++++++++++ 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/web/api.rs b/src/web/api.rs index 99a87675..81096767 100644 --- a/src/web/api.rs +++ b/src/web/api.rs @@ -3,9 +3,9 @@ use std::{collections::HashMap, sync::Arc}; -use futures::{future, sync::oneshot, Future}; +use futures::{sync::oneshot, Future}; -use hyper::{header, service::Service, Body, Method, Request, Response, StatusCode}; +use hyper::{service::Service, Body, Method, Request, StatusCode}; use rbx_dom_weak::RbxId; use crate::{ @@ -74,13 +74,10 @@ impl ApiService { let input_cursor: u32 = match argument.parse() { Ok(v) => v, Err(err) => { - return Box::new(future::ok( - Response::builder() - .status(StatusCode::BAD_REQUEST) - .header(header::CONTENT_TYPE, "text/plain") - .body(Body::from(err.to_string())) - .unwrap(), - )); + return json( + ErrorResponse::bad_request(format!("Malformed message cursor: {}", err)), + StatusCode::BAD_REQUEST, + ); } }; @@ -92,21 +89,16 @@ impl ApiService { message_queue.subscribe(input_cursor, sender); } - Box::new(receiver.then(move |result| { - match result { - Ok((message_cursor, messages)) => json_ok(SubscribeResponse { - session_id, - message_cursor, - messages, - }), - Err(_) => Box::new(future::ok( - Response::builder() - .status(StatusCode::INTERNAL_SERVER_ERROR) - .header(header::CONTENT_TYPE, "text/plain") - .body(Body::from("Message queue disconnected sender!")) - .unwrap(), - )), - } + Box::new(receiver.then(move |result| match result { + Ok((message_cursor, messages)) => json_ok(SubscribeResponse { + session_id, + message_cursor, + messages, + }), + Err(_) => json( + ErrorResponse::internal_error("Message queue disconnected sender"), + StatusCode::INTERNAL_SERVER_ERROR, + ), })) } @@ -117,13 +109,10 @@ impl ApiService { let requested_ids = match requested_ids { Some(ids) => ids, None => { - return Box::new(future::ok( - Response::builder() - .status(StatusCode::BAD_REQUEST) - .header(header::CONTENT_TYPE, "text/plain") - .body(Body::from("Malformed ID list")) - .unwrap(), - )); + return json( + ErrorResponse::bad_request("Malformed ID list"), + StatusCode::BAD_REQUEST, + ); } }; diff --git a/src/web/interface.rs b/src/web/interface.rs index 73d53b6b..ccc7c0c3 100644 --- a/src/web/interface.rs +++ b/src/web/interface.rs @@ -93,9 +93,25 @@ impl ErrorResponse { details: details.into(), } } + + pub fn bad_request>(details: S) -> Self { + Self { + kind: ErrorResponseKind::BadRequest, + details: details.into(), + } + } + + pub fn internal_error>(details: S) -> Self { + Self { + kind: ErrorResponseKind::InternalError, + details: details.into(), + } + } } #[derive(Debug, Serialize, Deserialize)] pub enum ErrorResponseKind { NotFound, + BadRequest, + InternalError, }