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

特性reqwestisahc
异步支持✅ 原生 async
底层hyperlibcurl
HTTPS Tunnel✅ 通过 libcurl 设置
生态最流行较小
API 风格Rust 标准类似 curl

需要企业代理方案?

我们可根据目标站点、并发规模与稳定性目标提供定制方案。