If the HttpClient attempts to reconnect to bitcoind that is no longer
running, the client fails to get the address from the stream. Cache the
address when connecting to prevent this.
use std::fmt;
#[cfg(not(feature = "tokio"))]
use std::io::Write;
use std::fmt;
#[cfg(not(feature = "tokio"))]
use std::io::Write;
-use std::net::ToSocketAddrs;
+use std::net::{SocketAddr, ToSocketAddrs};
use std::time::Duration;
#[cfg(feature = "tokio")]
use std::time::Duration;
#[cfg(feature = "tokio")]
/// Client for making HTTP requests.
pub(crate) struct HttpClient {
/// Client for making HTTP requests.
pub(crate) struct HttpClient {
TcpStream::from_std(stream)?
};
TcpStream::from_std(stream)?
};
+ Ok(Self { address, stream })
}
/// Sends a `GET` request for a resource identified by `uri` at the `host`.
}
/// Sends a `GET` request for a resource identified by `uri` at the `host`.
/// Sends an HTTP request message and reads the response, returning its body. Attempts to
/// reconnect and retry if the connection has been closed.
async fn send_request_with_retry(&mut self, request: &str) -> std::io::Result<Vec<u8>> {
/// Sends an HTTP request message and reads the response, returning its body. Attempts to
/// reconnect and retry if the connection has been closed.
async fn send_request_with_retry(&mut self, request: &str) -> std::io::Result<Vec<u8>> {
- let endpoint = self.stream.peer_addr().unwrap();
match self.send_request(request).await {
Ok(bytes) => Ok(bytes),
Err(_) => {
match self.send_request(request).await {
Ok(bytes) => Ok(bytes),
Err(_) => {
tokio::time::sleep(Duration::from_millis(100)).await;
#[cfg(not(feature = "tokio"))]
std::thread::sleep(Duration::from_millis(100));
tokio::time::sleep(Duration::from_millis(100)).await;
#[cfg(not(feature = "tokio"))]
std::thread::sleep(Duration::from_millis(100));
- *self = Self::connect(endpoint)?;
+ *self = Self::connect(self.address)?;
self.send_request(request).await
},
}
self.send_request(request).await
},
}