diff --git a/src/request_handler.rs b/src/request_handler.rs index cbabe12..ee1e11e 100644 --- a/src/request_handler.rs +++ b/src/request_handler.rs @@ -3,6 +3,7 @@ use reqwest::{Client, Method, RequestBuilder, Response, StatusCode, Url}; use serde::{Deserialize, Serialize}; use std::fmt::Debug; use std::sync::Arc; +use serde_json::Value; /// Manages HTTP requests for the `Helius` client /// @@ -100,10 +101,18 @@ impl RequestHandler { } } } else { - let body_json: serde_json::Result = serde_json::from_str(&body_text); + let body_json: serde_json::Result = serde_json::from_str(&body_text); match body_json { Ok(body) => { - let error_message: String = body["error"].as_str().unwrap_or("Unknown error").to_string(); + let error_message = match body["error"].clone() { + Value::Object(error_value) => { + error_value.into_iter().map(|(k, v)| format!("{}: {}", k, v)).collect::>().join(", ").to_string() + } + Value::String(error_value) => { + error_value + } + _ => "Unknown error".to_string(), + }; Err(HeliusError::from_response_status(status, path, error_message)) } Err(_) => Err(HeliusError::from_response_status(status, path, body_text)), diff --git a/tests/test_request_handler.rs b/tests/test_request_handler.rs index d80ebbc..3cd2a97 100644 --- a/tests/test_request_handler.rs +++ b/tests/test_request_handler.rs @@ -45,7 +45,7 @@ async fn test_bad_request_error() { .mock("GET", "/") .with_status(400) .with_header("content-type", "application/json") - .with_body(r#"{"message": "bad request"}"#) + .with_body(r#"{"error": "bad request"}"#) .create(); let client: Arc = Arc::new(Client::new()); @@ -63,3 +63,42 @@ async fn test_bad_request_error() { server.reset(); } + +#[tokio::test] +async fn test_bad_request_with_json_rpc_error() { + let mut server: Server = Server::new_with_opts_async(mockito::ServerOpts::default()).await; + let url: String = server.url(); + + server + .mock("GET", "/") + .with_status(400) + .with_header("content-type", "application/json") + .with_body(r#" + { + "jsonrpc": "2.0", + "error": { + "code": -32603, + "message": "internal error: please contact Helius support if this persists" + } + }"#) + .create(); + + let client: Arc = Arc::new(Client::new()); + let handler: RequestHandler = RequestHandler::new(client).unwrap(); + + let response: Result = handler + .send::<(), MockResponse>(Method::GET, url.parse().unwrap(), None) + .await; + + assert!(response.is_err()); + match response { + Err(HeliusError::BadRequest { text, .. }) => + assert_eq!( + text, + "code: -32603, message: \"internal error: please contact Helius support if this persists\"" + ), + _ => panic!("Expected BadRequest error"), + } + + server.reset(); +}