diff --git a/Cargo.lock b/Cargo.lock index 34f5b43..9ae47c4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1834,6 +1834,7 @@ dependencies = [ "rocket_codegen", "rocket_http", "serde", + "serde_json", "state", "tempfile", "time", diff --git a/Cargo.toml b/Cargo.toml index 49b7b81..574196d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rocket = "0.5.0" +rocket = {version = "0.5.0", features = ["json"]} serde = {version = "1.0.198", features = ["derive"]} serde_json = "1.0.111" num-format = "0.4.4" diff --git a/src/main.rs b/src/main.rs index 77afd63..b4f9707 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,11 @@ #[macro_use] extern crate rocket; -use rocket_dyn_templates::Template; -use rocket_dyn_templates::context; +use rocket_dyn_templates::{Template, context}; use rocket::fs::FileServer; -use rocket::State; +use rocket::{State, tokio}; +use rocket::serde::json::Json; +use rocket::response::Redirect; use std::sync::{Arc, Mutex}; use std::time::Duration; -use rocket::tokio; -use rocket::response::Redirect; use either::Either; use serde_json::Value; @@ -229,18 +228,18 @@ pub async fn search(input: Option<&str>) -> Either { // Owner API. // Whitelisted methods: get_connected_peers, get_peers, get_status. #[post("/v2/owner", data="")] -async fn api_owner(data: &str) -> String { +async fn api_owner(data: &str) -> Json { if CONFIG.public_api == "enabled" { let result = serde_json::from_str(data); let v: Value = match result { Ok(value) => value, - Err(_err) => return "{\"error\":\"bad syntax\"}".to_string(), + Err(_err) => return Json("{\"error\":\"bad syntax\"}".to_string()), }; let method = match v["method"].as_str() { Some(value) => value, - _ => return "{\"error\":\"bad syntax\"}".to_string(), + _ => return Json("{\"error\":\"bad syntax\"}".to_string()), }; if method == "get_connected_peers" || method == "get_peers" || method == "get_status" { @@ -248,15 +247,15 @@ async fn api_owner(data: &str) -> String { let result = match resp { Ok(value) => value, - Err(_err) => return "{\"error\":\"rpc call failed\"}".to_string(), + Err(_err) => return Json("{\"error\":\"rpc call failed\"}".to_string()), }; - return result.to_string(); + return Json(result.to_string()); } - "{\"error\":\"not allowed\"}".to_string() + Json("{\"error\":\"not allowed\"}".to_string()) } else { - "{\"error\":\"not allowed\"}".to_string() + Json("{\"error\":\"not allowed\"}".to_string()) } } @@ -264,30 +263,30 @@ async fn api_owner(data: &str) -> String { // Foreign API. // All methods are whitelisted. #[post("/v2/foreign", data="")] -async fn api_foreign(data: &str) -> String { +async fn api_foreign(data: &str) -> Json { if CONFIG.public_api == "enabled" { let result = serde_json::from_str(data); let v: Value = match result { Ok(value) => value, - Err(_err) => return "{\"error\":\"bad syntax\"}".to_string(), + Err(_err) => return Json("{\"error\":\"bad syntax\"}".to_string()), }; let method = match v["method"].as_str() { Some(value) => value, - _ => return "{\"error\":\"bad syntax\"}".to_string(), + _ => return Json("{\"error\":\"bad syntax\"}".to_string()), }; let resp = requests::call(method, v["params"].to_string().as_str(), v["id"].to_string().as_str(), "foreign").await; let result = match resp { Ok(value) => value, - Err(_err) => return "{\"error\":\"rpc call failed\"}".to_string(), + Err(_err) => return Json("{\"error\":\"rpc call failed\"}".to_string()), }; - return result.to_string(); + return Json(result.to_string()); } else { - "{\"error\":\"not allowed\"}".to_string() + Json("{\"error\":\"not allowed\"}".to_string()) } } diff --git a/src/requests.rs b/src/requests.rs index 8ef7761..2336bde 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -80,9 +80,9 @@ pub async fn call(method: &str, params: &str, id: &str, rpc_type: &str) -> Resul let client = reqwest::Client::new(); let result = client.post(rpc_url) - .body(format!("{{\"method\": \"{}\", \"params\": {}, \"id\": {}}}", method, params, id)) + .body(format!("{{\"method\": \"{}\", \"params\": {}, \"id\": {}, \"jsonrpc\": \"2.0\"}}", method, params, id)) .basic_auth(CONFIG.user.clone(), Some(secret)) - .header("content-type", "plain/text") + .header("content-type", "application/json") .send() .await?;