diff --git a/impls/src/adapters/http.rs b/impls/src/adapters/http.rs index 5b94dee86..e96ff5004 100644 --- a/impls/src/adapters/http.rs +++ b/impls/src/adapters/http.rs @@ -200,9 +200,10 @@ impl HttpSlateSender { let client = if !self.use_socks { Client::new() } else { - Client::with_socks_proxy( + Client::with_proxy( self.socks_proxy_addr .ok_or_else(|| ClientError::Internal("No socks proxy address set".into()))?, + "socks5h://", ) } .map_err(|_| ClientError::Internal("Unable to create http client".into()))?; diff --git a/impls/src/client_utils/client.rs b/impls/src/client_utils/client.rs index 47f16fb49..ec0ee0ff9 100644 --- a/impls/src/client_utils/client.rs +++ b/impls/src/client_utils/client.rs @@ -65,11 +65,11 @@ impl Client { Self::build(None) } - pub fn with_socks_proxy(socks_proxy_addr: SocketAddr) -> Result { - Self::build(Some(socks_proxy_addr)) + pub fn with_proxy(socks_proxy_addr: SocketAddr, scheme: &'static str) -> Result { + Self::build(Some((socks_proxy_addr, scheme))) } - fn build(socks_proxy_addr: Option) -> Result { + fn build(proxy: Option<(SocketAddr, &str)>) -> Result { let mut headers = HeaderMap::new(); headers.insert(USER_AGENT, HeaderValue::from_static("grin-client")); headers.insert(ACCEPT, HeaderValue::from_static("application/json")); @@ -80,8 +80,9 @@ impl Client { .use_rustls_tls() .default_headers(headers); - if let Some(s) = socks_proxy_addr { - let proxy = Proxy::all(&format!("socks5h://{}:{}", s.ip(), s.port())) + if let Some(p) = proxy { + let (addr, scheme) = p; + let proxy = Proxy::all(&format!("{}{}:{}", scheme, addr.ip(), addr.port())) .map_err(|e| Error::Internal(format!("Unable to create proxy: {}", e)))?; builder = builder.proxy(proxy); } diff --git a/impls/src/node_clients/http.rs b/impls/src/node_clients/http.rs index 83e04882b..66efeb761 100644 --- a/impls/src/node_clients/http.rs +++ b/impls/src/node_clients/http.rs @@ -15,17 +15,17 @@ //! Client functions, implementations of the NodeClient trait use crate::api::{self, LocatedTxKernel, OutputListing, OutputPrintable}; +use crate::client_utils::{Client, RUNTIME}; use crate::core::core::{Transaction, TxKernel}; +use crate::libwallet; use crate::libwallet::{NodeClient, NodeVersionInfo}; +use crate::util::secp::pedersen; +use crate::util::ToHex; use futures::stream::FuturesUnordered; use futures::TryStreamExt; use std::collections::HashMap; use std::env; - -use crate::client_utils::{Client, RUNTIME}; -use crate::libwallet; -use crate::util::secp::pedersen; -use crate::util::ToHex; +use std::net::SocketAddr; use super::resp_types::*; use crate::client_utils::json_rpc::*; @@ -46,8 +46,22 @@ impl HTTPNodeClient { node_url: &str, node_api_secret: Option, ) -> Result { + Self::new_proxy(node_url, node_api_secret, None) + } + + /// Create a new client with proxy + pub fn new_proxy( + node_url: &str, + node_api_secret: Option, + proxy: Option<(SocketAddr, &'static str)>, + ) -> Result { + let client = if let Some((a, s)) = proxy { + Client::with_proxy(a, s) + } else { + Client::new() + }; Ok(HTTPNodeClient { - client: Client::new().map_err(|_| libwallet::Error::Node)?, + client: client.map_err(|_| libwallet::Error::Node)?, node_url: node_url.to_owned(), node_api_secret: node_api_secret, node_version_info: None,