做了一个 Rust 的代理库(SOCKS5 等),想寻求些建议

查看 72|回复 3
作者:dynos01   
同时在 Rust 官方论坛发了贴 https://users.rust-lang.org/t/built-a-proxy-crate-looking-for-suggestions/90862/1,内容是一样的。
刚刚用 Rust 不久,前些阵子需要在程序中用到代理,查了一趟发现没有一个通用的代理库,那就干脆自己糊一个练手了。现在刚刚做了一个看起来能用的版本,想来寻求一些意见建议。
库名叫 proxie,链接在此 GitHub docs.rs。当前还没来得及写文档,文档是 Cargo 生成的。基本用法如下:
use tokio::{io::{AsyncWriteExt, BufReader, AsyncBufReadExt}};
use futures::future;
use proxie::{SOCKS5Proxy, tokio::AsyncProxy};
#[tokio::main]
async fn main() {
    let n_thread = 10;
    let mut handles = vec![];
    for _ in 0..n_thread {
        handles.push(tokio::spawn(async {
            let request = format!("GET / HTTP/1.1\r\n\r\n");
            let server = SOCKS5Proxy::new("127.0.0.1", 1080, None);
            let mut stream = server.connect("example.com:80").await.unwrap();
            //let mut stream = TcpStream::connect("example.com:80").await.unwrap();
            stream.write_all(request.as_bytes()).await.unwrap();
            stream.flush().await.unwrap();
            let mut reader = BufReader::new(&mut stream);
            let mut buffer = String::new();
            loop {
                reader.read_line(&mut buffer).await.unwrap();
                if buffer.ends_with("\r\n\r\n") {
                    break;
                }
            }
            print!("{}", buffer);
        }));
    }
    future::join_all(handles).await;
}
或者带认证的话
...
use proxie::{SOCKS5Proxy, tokio::AsyncProxy, Auth};
...
let server = SOCKS5Proxy::new("127.0.0.1", 1080, Auth::new("user", "pass"));
...
总之基本上就是在 TcpStream 上套了一层壳。除此之外还有 async-std 版本和同步的 std::net 版本,也支持 HTTP 代理。用法都是一样的。具体的运行时用 features 打开:
proxie = { version = "0.0.2", features = ["enable_tokio"] }
//Available features: "enable_tokio", "enable_async_std" and "enable_sync".
此外是接下来的计划:
  • 完善文档
  • SOCKS5 UDP 支持
  • HTTPS 代理和 SOCKS4a 代理(低优先级,好像很少有人用)
  • 完善套的壳,把各个 TcpStream 上所有的方法都实现了,实现无痛接入
  • 单元测试

    现在比较关心的地方是这套面向用户的接口是否合理?如果可能的话还是希望尽快稳定 API 以后就不改了。感觉好像还行,听听大佬们建议。
    差不多就是这样了,提前感谢一切意见建议!如果有人也在寻找类似的库的话欢迎来帮忙测试一下!

    mut, Let, await, unwrap

  • xieren58   
    不错不错...
    molezz765   
    就是想流畅的用个网络 搜搜资料 发发推
    在用 rust tuic ……
    rekulas   
    可以考虑支持前置代理
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部