+//! Simple HTTP implementation which supports both async and traditional execution environments
+//! with minimal dependencies. This is used as the basis for REST and RPC clients.
+
use chunked_transfer;
use serde_json;
let endpoint = self.stream.peer_addr().unwrap();
match self.send_request(request).await {
Ok(bytes) => Ok(bytes),
- Err(e) => match e.kind() {
- std::io::ErrorKind::ConnectionReset |
- std::io::ErrorKind::ConnectionAborted |
- std::io::ErrorKind::UnexpectedEof => {
- // Reconnect if the connection was closed. This may happen if the server's
- // keep-alive limits are reached.
- *self = Self::connect(endpoint)?;
- self.send_request(request).await
- },
- _ => Err(e),
+ Err(_) => {
+ // Reconnect and retry on fail. This can happen if the connection was closed after
+ // the keep-alive limits are reached, or generally if the request timed out due to
+ // Bitcoin Core being stuck on a long-running operation or its RPC queue being
+ // full.
+ // Block 100ms before retrying the request as in many cases the source of the error
+ // may be persistent for some time.
+ #[cfg(feature = "tokio")]
+ tokio::time::sleep(Duration::from_millis(100)).await;
+ #[cfg(not(feature = "tokio"))]
+ std::thread::sleep(Duration::from_millis(100));
+ *self = Self::connect(endpoint)?;
+ self.send_request(request).await
},
}
}
}
/// An HTTP response body in binary format.
-pub(crate) struct BinaryResponse(pub(crate) Vec<u8>);
+pub struct BinaryResponse(pub Vec<u8>);
/// An HTTP response body in JSON format.
-pub(crate) struct JsonResponse(pub(crate) serde_json::Value);
+pub struct JsonResponse(pub serde_json::Value);
/// Interprets bytes from an HTTP response body as binary data.
impl TryFrom<Vec<u8>> for BinaryResponse {