Skip to content

Commit bc18f66

Browse files
Merge libsql#51
51: return error on deserializing http json payload r=MarinPostma a=MarinPostma Deserialization error were ignored Co-authored-by: ad hoc <[email protected]>
2 parents 9134c42 + ee89cea commit bc18f66

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

server/src/http/mod.rs

+17-5
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ use bytes::{BufMut, Bytes, BytesMut};
99
use hyper::body::to_bytes;
1010
use hyper::server::conn::AddrStream;
1111
use hyper::service::make_service_fn;
12-
use hyper::{Body, Method, Request, Response};
12+
use hyper::{Body, Method, Request, Response, StatusCode};
1313
use serde_json::{json, Number};
1414
use tokio::sync::{mpsc, oneshot};
15+
use tonic::codegen::http;
1516
use tower::balance::pool;
1617
use tower::load::Load;
1718
use tower::{service_fn, BoxError, MakeService, Service};
@@ -77,7 +78,7 @@ fn query_response_to_json(results: Vec<QueryResult>) -> anyhow::Result<Bytes> {
7778
Ok(buffer.into_inner().freeze())
7879
}
7980

80-
fn error(msg: &str, code: u16) -> Response<Body> {
81+
fn error(msg: &str, code: StatusCode) -> Response<Body> {
8182
let err = json!({ "error": msg });
8283
Response::builder()
8384
.status(code)
@@ -116,17 +117,28 @@ struct Message {
116117
resp: oneshot::Sender<Result<Vec<QueryResult>, BoxError>>,
117118
}
118119

120+
fn parse_payload(data: &[u8]) -> Result<HttpQuery, Response<Body>> {
121+
match serde_json::from_slice(data) {
122+
Ok(data) => Ok(data),
123+
Err(e) => Err(error(&e.to_string(), http::status::StatusCode::BAD_REQUEST)),
124+
}
125+
}
126+
119127
async fn handle_query(
120128
mut req: Request<Body>,
121129
sender: mpsc::Sender<Message>,
122130
) -> anyhow::Result<Response<Body>> {
123131
let bytes = to_bytes(req.body_mut()).await?;
124-
let req: HttpQuery = serde_json::from_slice(&bytes)?;
132+
let req = match parse_payload(&bytes) {
133+
Ok(req) => req,
134+
Err(resp) => return Ok(resp),
135+
};
136+
125137
let (s, resp) = oneshot::channel();
126138

127139
let queries = match parse_queries(req.statements) {
128140
Ok(queries) => queries,
129-
Err(e) => return Ok(error(&e.to_string(), 400)),
141+
Err(e) => return Ok(error(&e.to_string(), StatusCode::BAD_REQUEST)),
130142
};
131143

132144
let msg = Message { queries, resp: s };
@@ -138,7 +150,7 @@ async fn handle_query(
138150
let json = query_response_to_json(rows)?;
139151
Ok(Response::new(Body::from(json)))
140152
}
141-
Err(_) | Ok(Err(_)) => Ok(error("internal error", 500)),
153+
Err(_) | Ok(Err(_)) => Ok(error("internal error", StatusCode::INTERNAL_SERVER_ERROR)),
142154
}
143155
}
144156

0 commit comments

Comments
 (0)