|
2 | 2 | //! endpoint.
|
3 | 3 |
|
4 | 4 | use crate::{BlockHeaderData, BlockSource, AsyncBlockSourceResult};
|
5 |
| -use crate::http::{HttpClient, HttpEndpoint, JsonResponse}; |
| 5 | +use crate::http::{HttpClient, HttpEndpoint, HttpError, JsonResponse}; |
6 | 6 |
|
7 | 7 | use bitcoin::blockdata::block::Block;
|
8 | 8 | use bitcoin::hash_types::BlockHash;
|
@@ -47,8 +47,20 @@ impl RpcClient {
|
47 | 47 | "id": &self.id.fetch_add(1, Ordering::AcqRel).to_string()
|
48 | 48 | });
|
49 | 49 |
|
50 |
| - let mut response = self.client.post::<JsonResponse>(&uri, &host, &self.basic_auth, content) |
51 |
| - .await?.0; |
| 50 | + let mut response = match self.client.post::<JsonResponse>(&uri, &host, &self.basic_auth, content).await { |
| 51 | + Ok(JsonResponse(response)) => response, |
| 52 | + Err(e) if e.kind() == std::io::ErrorKind::Other => { |
| 53 | + match e.get_ref().unwrap().downcast_ref::<HttpError>() { |
| 54 | + Some(http_error) => match JsonResponse::try_from(http_error.contents.clone()) { |
| 55 | + Ok(JsonResponse(response)) => response, |
| 56 | + Err(_) => Err(e)?, |
| 57 | + }, |
| 58 | + None => Err(e)?, |
| 59 | + } |
| 60 | + }, |
| 61 | + Err(e) => Err(e)?, |
| 62 | + }; |
| 63 | + |
52 | 64 | if !response.is_object() {
|
53 | 65 | return Err(std::io::Error::new(std::io::ErrorKind::InvalidData, "expected JSON object"));
|
54 | 66 | }
|
@@ -143,7 +155,7 @@ mod tests {
|
143 | 155 | let response = serde_json::json!({
|
144 | 156 | "error": { "code": -8, "message": "invalid parameter" },
|
145 | 157 | });
|
146 |
| - let server = HttpServer::responding_with_ok(MessageBody::Content(response)); |
| 158 | + let server = HttpServer::responding_with_server_error(response); |
147 | 159 | let mut client = RpcClient::new(CREDENTIALS, server.endpoint()).unwrap();
|
148 | 160 |
|
149 | 161 | let invalid_block_hash = serde_json::json!("foo");
|
|
0 commit comments