Rust 隧道代理:reqwest 与 isahc 两种实现
Rust reqwest 和 isahc HTTP 客户端库对接亿牛云爬虫代理。reqwest 不支持 HTTPS Proxy-Tunnel。
亿牛云技术团队2026年5月1日1 分钟阅读
reqwest
reqwest 是 Rust 最流行的 HTTP 客户端,通过 Proxy::all 配置代理。注意:reqwest 不支持 在 HTTPS CONNECT 阶段注入自定义头,因此 HTTPS Proxy-Tunnel 无效。
use reqwest::{Proxy, Client};
use std::env;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let host = env::var("PROXY_HOST").unwrap_or_else(|_| "t.16yun.cn".into());
let port = env::var("PROXY_PORT").unwrap_or_else(|_| "31111".into());
let user = env::var("PROXY_USERNAME").unwrap_or_else(|_| "user".into());
let pass = env::var("PROXY_PASSWORD").unwrap_or_else(|_| "password".into());
let proxy_url = format!("http://{}:{}@{}:{}", user, pass, host, port);
let proxy = Proxy::all(&proxy_url)?;
let client = Client::builder()
.proxy(proxy)
.timeout(std::time::Duration::from_secs(15))
.build()?;
let resp = client.get("https://httpbin.org/ip").send().await?;
println!("{}", resp.text().await?);
Ok(())
}
Proxy-Tunnel 限制
// HTTP Proxy-Tunnel(有效)
let resp = client.get("http://httpbin.org/ip")
.header("Proxy-Tunnel", "rust-demo")
.send().await?;
// HTTPS Proxy-Tunnel(无效——reqwest 不支持 CONNECT 阶段自定义头)
let resp = client.get("https://httpbin.org/ip")
.header("Proxy-Tunnel", "rust-demo") // 这个头不会在 CONNECT 阶段发送
.send().await?;
| 场景 | reqwest | 说明 |
|---|---|---|
| A:强制切换 | pool_max_idle_per_host(0) | 禁用连接池 |
| B:保持 IP | 默认行为 | 复用连接 |
| C-HTTP:Proxy-Tunnel | .header("Proxy-Tunnel", ...) | 请求头发送 |
| C-HTTPS:Proxy-Tunnel | ❌ 不支持 | 无法在 CONNECT 阶段注入头 |
如需 HTTPS Proxy-Tunnel,考虑 Go(
Transport.ProxyConnectHeader)或 Python httpx(httpx.Proxy(headers=...))。
isahc
isahc 基于 libcurl,支持更多代理特性:
use isahc::{HttpClient, Request, auth::Authentication};
use std::env;
fn main() -> Result<(), isahc::Error> {
let host = env::var("PROXY_HOST").unwrap_or_else(|_| "t.16yun.cn".into());
let port = env::var("PROXY_PORT").unwrap_or_else(|_| "31111".into());
let user = env::var("PROXY_USERNAME").unwrap_or_else(|_| "user".into());
let pass = env::var("PROXY_PASSWORD").unwrap_or_else(|_| "password".into());
let client = HttpClient::builder()
.proxy(Some(format!("http://{}:{}", host, port).parse().unwrap()))
.proxy_authentication(Authentication::basic(user, pass))
.timeout(std::time::Duration::from_secs(15))
.build()?;
let resp = client.get("https://httpbin.org/ip")?;
println!("{}", resp.text()?);
Ok(())
}
reqwest vs isahc
| 特性 | reqwest | isahc |
|---|---|---|
| 异步支持 | ✅ 原生 async | ✅ |
| 底层 | hyper | libcurl |
| HTTPS Tunnel | ❌ | ✅ 通过 libcurl 设置 |
| 生态 | 最流行 | 较小 |
| API 风格 | Rust 标准 | 类似 curl |
需要企业代理方案?
我们可根据目标站点、并发规模与稳定性目标提供定制方案。