#proxy #tokio #connect #env-var #socks5 #io #url

phala-tokio-proxy

为tokio提供代理支持

1个不稳定版本

0.1.0 2023年12月11日

#16#socks5

Download history 98/week @ 2024-03-11 39/week @ 2024-03-18 91/week @ 2024-03-25 70/week @ 2024-04-01 38/week @ 2024-04-08 47/week @ 2024-04-15 56/week @ 2024-04-22 23/week @ 2024-04-29 70/week @ 2024-05-06 31/week @ 2024-05-13 118/week @ 2024-05-20 45/week @ 2024-05-27 44/week @ 2024-06-03 47/week @ 2024-06-10 46/week @ 2024-06-17 35/week @ 2024-06-24

每月175次下载
5 个crate中使用 (通过 sidevm-host-runtime)

Apache-2.0

11KB
174

tokio-proxy

这个简单的库可以帮助通过代理(目前仅支持SOCKS5)进行tokio TCP连接。

connect函数与TcpStream::connect类似,额外参数用于指定代理URL字符串。

pub async fn connect<A: ToSocketAddrsExt, T: AsRef<str>>(
    addr: A,
    proxy_url: T,
) -> io::Result<TcpStream>

示例

您可以在examples/env_proxy.rs中查看。

它检查环境变量all_proxy作为代理URL,如果不存在,则直接连接到httpbin.org。

    rt.block_on(async move {
        let mut s = match env::var("all_proxy") {
            Ok(proxy) => tokio_proxy::connect("httpbin.org:80", proxy).await.unwrap(),
            Err(_) => TcpStream::connect("httpbin.org:80").await.unwrap(),
        };

        s.write_all(
            b"GET /get HTTP/1.1\r\n\
        Host: httpbin.org\r\n\r\n",
        )
        .await
        .unwrap();

        let mut buf = [0; 512];
        s.read(&mut buf).await.unwrap();

        for line in str::from_utf8(&buf).unwrap().lines() {
            println!("{}", line);
        }
    });

如果代理URL使用socks5方案,则会在本地解析域名,并对所有解析出的IP地址进行迭代,直到成功或全部失败。

如果代理URL使用socks5h方案,则将域名直接发送到代理。

这与curl的行为类似。

$ all_proxy=socks5h://127.0.0.1:8080 cargo run --example env_proxy
    Finished dev [unoptimized + debuginfo] target(s) in 0.24s
     Running `target\debug\examples\env_proxy.exe`
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
...

依赖关系

~3.5–10MB
~109K SLoC