Cache socket address in HttpClient for reconnect

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.
This commit is contained in:
Jeffrey Czyz 2021-05-27 08:53:14 -07:00
parent 8e7b5905fd
commit 4a12d7656e
No known key found for this signature in database
GPG key ID: 3A4E08275D5E96D2

View file

@ -8,7 +8,7 @@ use std::convert::TryFrom;
use std::fmt; use std::fmt;
#[cfg(not(feature = "tokio"))] #[cfg(not(feature = "tokio"))]
use std::io::Write; use std::io::Write;
use std::net::ToSocketAddrs; use std::net::{SocketAddr, ToSocketAddrs};
use std::time::Duration; use std::time::Duration;
#[cfg(feature = "tokio")] #[cfg(feature = "tokio")]
@ -97,6 +97,7 @@ impl<'a> std::net::ToSocketAddrs for &'a HttpEndpoint {
/// Client for making HTTP requests. /// Client for making HTTP requests.
pub(crate) struct HttpClient { pub(crate) struct HttpClient {
address: SocketAddr,
stream: TcpStream, stream: TcpStream,
} }
@ -119,7 +120,7 @@ impl HttpClient {
TcpStream::from_std(stream)? TcpStream::from_std(stream)?
}; };
Ok(Self { 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`.
@ -162,7 +163,6 @@ impl HttpClient {
/// Sends an HTTP request message and reads the response, returning its body. Attempts to /// Sends an HTTP request message and reads the response, returning its body. Attempts to
/// reconnect and retry if the connection has been closed. /// reconnect and retry if the connection has been closed.
async fn send_request_with_retry(&mut self, request: &str) -> std::io::Result<Vec<u8>> { 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 { match self.send_request(request).await {
Ok(bytes) => Ok(bytes), Ok(bytes) => Ok(bytes),
Err(_) => { Err(_) => {
@ -176,7 +176,7 @@ impl HttpClient {
tokio::time::sleep(Duration::from_millis(100)).await; tokio::time::sleep(Duration::from_millis(100)).await;
#[cfg(not(feature = "tokio"))] #[cfg(not(feature = "tokio"))]
std::thread::sleep(Duration::from_millis(100)); 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
}, },
} }