From 9b4e1de1c0d561785628bd3887be10c002b4dd49 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Wed, 27 Feb 2019 12:12:00 +0100 Subject: [PATCH] rc/server/rest.rs: allow to pass parameters as application/json --- src/server/rest.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/server/rest.rs b/src/server/rest.rs index e92406c5..b5ad9cd0 100644 --- a/src/server/rest.rs +++ b/src/server/rest.rs @@ -117,6 +117,18 @@ fn get_request_parameters_async( uri_param: HashMap, ) -> Box + Send> { + let mut is_json = false; + + if let Some(value) = parts.headers.get(header::CONTENT_TYPE) { + if value == "application/x-www-form-urlencoded" { + is_json = false; + } else if value == "application/json" { + is_json = true; + } else { + return Box::new(future::err(http_err!(BAD_REQUEST, format!("unsupported content type")))); + } + } + let resp = req_body .map_err(|err| http_err!(BAD_REQUEST, format!("Promlems reading request body: {}", err))) .fold(Vec::new(), |mut acc, chunk| { @@ -130,6 +142,18 @@ fn get_request_parameters_async( let utf8 = std::str::from_utf8(&body)?; + let obj_schema = &info.parameters; + + if is_json { + let mut params: Value = serde_json::from_str(utf8)?; + for (k, v) in uri_param { + if let Some((_optional, prop_schema)) = obj_schema.properties.get::(&k) { + params[&k] = parse_simple_value(&v, prop_schema)?; + } + } + return Ok(params); + } + let mut param_list: Vec<(String, String)> = vec![]; if utf8.len() > 0 { @@ -150,7 +174,7 @@ fn get_request_parameters_async( param_list.push((k.clone(), v.clone())); } - let params = parse_parameter_strings(¶m_list, &info.parameters, true)?; + let params = parse_parameter_strings(¶m_list, obj_schema, true)?; Ok(params) });