http: provide proxy on node client creation (#738)

This commit is contained in:
ardocrat
2025-06-18 16:01:06 +01:00
committed by GitHub
parent b1ffe86a55
commit 930a44d456
3 changed files with 28 additions and 12 deletions
+2 -1
View File
@@ -200,9 +200,10 @@ impl HttpSlateSender {
let client = if !self.use_socks { let client = if !self.use_socks {
Client::new() Client::new()
} else { } else {
Client::with_socks_proxy( Client::with_proxy(
self.socks_proxy_addr self.socks_proxy_addr
.ok_or_else(|| ClientError::Internal("No socks proxy address set".into()))?, .ok_or_else(|| ClientError::Internal("No socks proxy address set".into()))?,
"socks5h://",
) )
} }
.map_err(|_| ClientError::Internal("Unable to create http client".into()))?; .map_err(|_| ClientError::Internal("Unable to create http client".into()))?;
+6 -5
View File
@@ -65,11 +65,11 @@ impl Client {
Self::build(None) Self::build(None)
} }
pub fn with_socks_proxy(socks_proxy_addr: SocketAddr) -> Result<Self, Error> { pub fn with_proxy(socks_proxy_addr: SocketAddr, scheme: &'static str) -> Result<Self, Error> {
Self::build(Some(socks_proxy_addr)) Self::build(Some((socks_proxy_addr, scheme)))
} }
fn build(socks_proxy_addr: Option<SocketAddr>) -> Result<Self, Error> { fn build(proxy: Option<(SocketAddr, &str)>) -> Result<Self, Error> {
let mut headers = HeaderMap::new(); let mut headers = HeaderMap::new();
headers.insert(USER_AGENT, HeaderValue::from_static("grin-client")); headers.insert(USER_AGENT, HeaderValue::from_static("grin-client"));
headers.insert(ACCEPT, HeaderValue::from_static("application/json")); headers.insert(ACCEPT, HeaderValue::from_static("application/json"));
@@ -80,8 +80,9 @@ impl Client {
.use_rustls_tls() .use_rustls_tls()
.default_headers(headers); .default_headers(headers);
if let Some(s) = socks_proxy_addr { if let Some(p) = proxy {
let proxy = Proxy::all(&format!("socks5h://{}:{}", s.ip(), s.port())) 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)))?; .map_err(|e| Error::Internal(format!("Unable to create proxy: {}", e)))?;
builder = builder.proxy(proxy); builder = builder.proxy(proxy);
} }
+20 -6
View File
@@ -15,17 +15,17 @@
//! Client functions, implementations of the NodeClient trait //! Client functions, implementations of the NodeClient trait
use crate::api::{self, LocatedTxKernel, OutputListing, OutputPrintable}; use crate::api::{self, LocatedTxKernel, OutputListing, OutputPrintable};
use crate::client_utils::{Client, RUNTIME};
use crate::core::core::{Transaction, TxKernel}; use crate::core::core::{Transaction, TxKernel};
use crate::libwallet;
use crate::libwallet::{NodeClient, NodeVersionInfo}; use crate::libwallet::{NodeClient, NodeVersionInfo};
use crate::util::secp::pedersen;
use crate::util::ToHex;
use futures::stream::FuturesUnordered; use futures::stream::FuturesUnordered;
use futures::TryStreamExt; use futures::TryStreamExt;
use std::collections::HashMap; use std::collections::HashMap;
use std::env; use std::env;
use std::net::SocketAddr;
use crate::client_utils::{Client, RUNTIME};
use crate::libwallet;
use crate::util::secp::pedersen;
use crate::util::ToHex;
use super::resp_types::*; use super::resp_types::*;
use crate::client_utils::json_rpc::*; use crate::client_utils::json_rpc::*;
@@ -46,8 +46,22 @@ impl HTTPNodeClient {
node_url: &str, node_url: &str,
node_api_secret: Option<String>, node_api_secret: Option<String>,
) -> Result<HTTPNodeClient, libwallet::Error> { ) -> Result<HTTPNodeClient, libwallet::Error> {
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<String>,
proxy: Option<(SocketAddr, &'static str)>,
) -> Result<HTTPNodeClient, libwallet::Error> {
let client = if let Some((a, s)) = proxy {
Client::with_proxy(a, s)
} else {
Client::new()
};
Ok(HTTPNodeClient { Ok(HTTPNodeClient {
client: Client::new().map_err(|_| libwallet::Error::Node)?, client: client.map_err(|_| libwallet::Error::Node)?,
node_url: node_url.to_owned(), node_url: node_url.to_owned(),
node_api_secret: node_api_secret, node_api_secret: node_api_secret,
node_version_info: None, node_version_info: None,