# reqwest-ss-proxy
---
## English
A `hyper` connector and `reqwest` middleware for proxying requests through a Shadowsocks server.
### Features
- **Hyper Connector**: Implements `tower::Service` to act as a connector for `hyper 1.x`.
- **Reqwest Middleware**: Provides a middleware for `reqwest` to easily proxy requests.
- **Easy to Use**: Create a connector or middleware from a Shadowsocks URL.
- **Async**: Fully asynchronous with `tokio`.
### Usage
#### With `hyper`
```rust
use reqwest_ss_proxy::SsConnector;
use hyper_util::client::legacy::Client;
use hyper::body::Buf;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. Create the SsConnector from a Shadowsocks URL.
let connector = SsConnector::new("ss://aes-256-gcm:password@server:port")? ;
// 2. Create a hyper client with the connector.
let client = Client::builder(hyper_util::rt::TokioExecutor::new()).build(connector);
// 3. Send a request.
let mut res = client.get("https://ifconfig.me/ip".parse()?).await? ;
while let Some(chunk) = res.body_mut().data().await {
println!("IP: {}", String::from_utf8_lossy(&chunk?));
}
Ok(())
}
```
#### With `reqwest`
```rust
use reqwest_ss_proxy::{SsConnector, reqwest::SsMiddleware};
use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. Create the SsConnector.
let connector = SsConnector::new("ss://aes-256-gcm:password@server:port")? ;
// 2. Create the SsMiddleware from the connector.
let ss_middleware = SsMiddleware::new(connector);
// 3. Build the reqwest client with the middleware.
let client = reqwest::Client::builder().build()? ;
let client_with_middleware: ClientWithMiddleware = ClientBuilder::new(client).with(ss_middleware).build();
// 4. Send the request using the reqwest API.
let res = client_with_middleware.get("http://ifconfig.me/ip").send().await? ;
let ip = res.text().await? ;
println!("IP: {}", ip);
Ok(())
}
```
---
## 中文
一个用于 `hyper` 的连接器和 `reqwest` 的中间件,可通过 Shadowsocks 服务器代理请求。
### 特性
- **Hyper 连接器**: 实现了 `tower::Service`,可作为 `hyper 1.x` 的连接器。
- **Reqwest 中间件**: 提供了 `reqwest` 中间件,可轻松代理请求。
- **易于使用**: 从 Shadowsocks URL 创建连接器或中间件。
- **异步**: 基于 `tokio` 的完全异步实现。
### 使用
#### 配合 `hyper`
```rust
use reqwest_ss_proxy::SsConnector;
use hyper_util::client::legacy::Client;
use hyper::body::Buf;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. 从 Shadowsocks URL 创建 SsConnector。
let connector = SsConnector::new("ss://aes-256-gcm:password@server:port")? ;
// 2. 使用连接器创建 hyper 客户端。
let client = Client::builder(hyper_util::rt::TokioExecutor::new()).build(connector);
// 3. 发送请求。
let mut res = client.get("http://ifconfig.me/ip".parse()?).await? ;
while let Some(chunk) = res.body_mut().data().await {
println!("IP: {}", String::from_utf8_lossy(&chunk?));
}
Ok(())
}
```
#### 配合 `reqwest`
```rust
use reqwest_ss_proxy::{SsConnector, reqwest::SsMiddleware};
use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. 创建 SsConnector。
let connector = SsConnector::new("ss://aes-256-gcm:password@server:port")? ;
// 2. 从连接器创建 SsMiddleware。
let ss_middleware = SsMiddleware::new(connector);
// 3. 使用中间件构建 reqwest 客户端。
let client = reqwest::Client::builder().build()? ;
let client_with_middleware: ClientWithMiddleware = ClientBuilder::new(client).with(ss_middleware).build();
// 4. 使用 reqwest API 发送请求。
let res = client_with_middleware.get("https://ifconfig.me/ip").send().await? ;
let ip = res.text().await? ;
println!("IP: {}", ip);
Ok(())
}
```
## About
This project is an open-source component of [i18n.site ⋅ Internationalization Solution](https://i18n.site).
* [i18 : MarkDown Command Line Translation Tool](https://i18n.site/i18)
The translation perfectly maintains the Markdown format.
It recognizes file changes and only translates the modified files.
The translated Markdown content is editable; if you modify the original text and translate it again, manually edited translations will not be overwritten (as long as the original text has not been changed).
* [i18n.site : MarkDown Multi-language Static Site Generator](https://i18n.site/i18n.site)
Optimized for a better reading experience
## 关于
本项目为 [i18n.site ⋅ 国际化解决方案](https://i18n.site) 的开源组件。
* [i18 : MarkDown 命令行翻译工具](https://i18n.site/i18)
翻译能够完美保持 Markdown 的格式。能识别文件的修改,仅翻译有变动的文件。
Markdown 翻译内容可编辑;如果你修改原文并再次机器翻译,手动修改过的翻译不会被覆盖 ( 如果这段原文没有被修改 )。
* [i18n.site : MarkDown 多语言静态站点生成器](https://i18n.site/i18n.site) 为阅读体验而优化。