同时在 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".
此外是接下来的计划:
TcpStream
上所有的方法都实现了,实现无痛接入现在比较关心的地方是这套面向用户的接口是否合理?如果可能的话还是希望尽快稳定 API 以后就不改了。感觉好像还行,听听大佬们建议。
差不多就是这样了,提前感谢一切意见建议!如果有人也在寻找类似的库的话欢迎来帮忙测试一下!
1
xieren58 2023-03-14 17:08:04 +08:00
不错不错...
|
2
molezznet 2023-03-14 17:22:00 +08:00
就是想流畅的用个网络 搜搜资料 发发推
在用 rust tuic …… |
3
rekulas 2023-03-14 17:23:18 +08:00
可以考虑支持前置代理
|
4
dynos01 OP |
5
chuanqirenwu 2023-03-14 20:43:50 +08:00
有没有类似 proxier 这样的替代品?
|