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