Files

86 lines
2.5 KiB
Rust

use std::net::{IpAddr, Ipv4Addr, SocketAddr, TcpStream};
use std::time::Duration;
use proxychains::config::{ProxyData, ProxyType};
use proxychains::proxy::{
http_connect, socks5_connect, establish_proxy_chain, TargetAddr, TargetAddress,
};
fn proxy_from_env(var: &str, proxy_type: ProxyType) -> Option<ProxyData> {
let raw = std::env::var(var).ok()?;
let addr: SocketAddr = raw.parse().ok()?;
let ip = match addr.ip() {
IpAddr::V4(v4) => v4,
IpAddr::V6(_) => return None,
};
Some(ProxyData::new(ip, addr.port(), proxy_type))
}
#[test]
fn socks5_backend_handshake_works() {
let Some(proxy) = proxy_from_env("PROXYCHAINS_TEST_SOCKS5_ADDR", ProxyType::Socks5) else {
eprintln!("skip: PROXYCHAINS_TEST_SOCKS5_ADDR not set");
return;
};
let mut stream = TcpStream::connect_timeout(
&SocketAddr::new(IpAddr::V4(proxy.ip), proxy.port),
Duration::from_secs(2),
)
.expect("connect socks5 proxy");
let target = TargetAddr::from_domain("example.com");
socks5_connect(&mut stream, &proxy, &target, 80, Duration::from_secs(8))
.expect("socks5 connect to target");
}
#[test]
fn http_connect_backend_handshake_works() {
let Some(proxy) = proxy_from_env("PROXYCHAINS_TEST_HTTP_ADDR", ProxyType::Http) else {
eprintln!("skip: PROXYCHAINS_TEST_HTTP_ADDR not set");
return;
};
let mut stream = TcpStream::connect_timeout(
&SocketAddr::new(IpAddr::V4(proxy.ip), proxy.port),
Duration::from_secs(2),
)
.expect("connect http proxy");
http_connect(
&mut stream,
&proxy,
"example.com",
443,
Duration::from_secs(8),
)
.expect("http CONNECT to target");
}
#[test]
fn establish_chain_with_real_socks5_works() {
let Some(proxy) = proxy_from_env("PROXYCHAINS_TEST_SOCKS5_ADDR", ProxyType::Socks5) else {
eprintln!("skip: PROXYCHAINS_TEST_SOCKS5_ADDR not set");
return;
};
let target = TargetAddress::from_domain("example.com");
let stream = establish_proxy_chain(
&[proxy],
&target,
80,
Duration::from_secs(3),
Duration::from_secs(8),
)
.expect("establish chain to target via real socks5");
let _ = stream.shutdown(std::net::Shutdown::Both);
}
#[test]
fn supports_group_probe_demo_shape() {
// Sanity regression around types expected by CLI probe json output.
let proxy = ProxyData::new(Ipv4Addr::new(127, 0, 0, 1), 1080, ProxyType::Socks5);
assert_eq!(proxy.proxy_type.to_string(), "socks5");
}