rust-proxy 0.1.0

A simple HTTP/HTTPS proxy server written in Rust
# Rust HTTP/HTTPS 代理服务器

一个用Rust实现的简单HTTP/HTTPS代理服务器。

## 功能特性

- 支持HTTP/1.1代理
- 支持HTTPS代理(通过CONNECT隧道)
- 支持请求转发和响应返回
- 简单的TCP层代理实现
- 命令行参数配置
- 自动解析目标地址
- 支持HTTP和HTTPS协议自动检测

## 三种实现方式

项目包含三种代理实现:

1. **主代理服务器** (`src/main.rs`): 支持HTTP和HTTPS的完整代理实现
2. **简单代理服务器** (`src/simple_proxy.rs`): 更简单的TCP层代理实现
3. **HTTPS代理服务器** (`src/https_proxy.rs`): 专注于HTTPS支持的代理实现

## 使用方法

### 1. 构建项目

```bash
cargo build --release
```

### 2. 启动主代理服务器(支持HTTP和HTTPS)

默认监听 `127.0.0.1:8080`:

```bash
cargo run --release
```

或指定监听地址:

```bash
cargo run --release -- --listen 0.0.0.0:8080
```

### 3. 启动简单代理服务器

```bash
cargo run --bin simple_proxy --release
```

### 4. 启动HTTPS代理服务器

```bash
cargo run --bin https_proxy --release
```

### 5. 启动高级HTTPS代理服务器

```bash
cargo run --bin https_proxy --release -- --https
```

### 6. 配置客户端使用代理

#### 使用 curl 测试HTTP:

```bash
curl -x http://127.0.0.1:8080 http://httpbin.org/get
```

#### 使用 curl 测试HTTPS:

```bash
curl -x http://127.0.0.1:8080 https://httpbin.org/get
```

#### 使用环境变量:

```bash
# Linux/macOS
export http_proxy=http://127.0.0.1:8080
export https_proxy=http://127.0.0.1:8080

# Windows
set http_proxy=http://127.0.0.1:8080
set https_proxy=http://127.0.0.1:8080
```

然后使用curl测试:
```bash
# 测试HTTP
curl http://httpbin.org/get

# 测试HTTPS
curl https://httpbin.org/get
```

### 7. 运行测试脚本

#### Linux/macOS:
```bash
chmod +x test_proxy.sh
./test_proxy.sh
```

#### Windows:
```bash
test_proxy.bat
```

## 命令行参数

主代理服务器支持以下参数:

```
--listen <LISTEN>    代理服务器监听的地址 [默认值: 127.0.0.1:8080]
-h, --help          显示帮助信息
-V, --version       显示版本信息
```

## 项目结构

```
src/
  main.rs          主代理服务器实现
  simple_proxy.rs  简单代理服务器实现
examples/
  test_client.rs   测试客户端示例
Cargo.toml         项目配置和依赖
README.md          项目说明
config.example.toml 配置文件示例
test_proxy.sh      Linux/macOS测试脚本
test_proxy.bat     Windows测试脚本
```

## 依赖库

- `tokio`: 异步运行时
- `clap`: 命令行参数解析
- `rustls`: TLS加密库
- `tokio-rustls`: 异步TLS支持
- `webpki`: 证书验证
- `webpki-roots`: 根证书库

## 工作原理

### HTTP代理工作原理:
1. 代理服务器监听指定端口
2. 收到客户端HTTP请求后,解析请求头和目标URL
3. 建立到目标服务器的TCP连接
4. 转发客户端请求到目标服务器
5. 将目标服务器的响应返回给客户端
6. 在客户端和目标服务器之间双向转发数据

### HTTPS代理工作原理:
1. 客户端发送CONNECT请求到代理服务器(如 `CONNECT example.com:443 HTTP/1.1`2. 代理服务器解析CONNECT请求中的目标地址
3. 代理服务器建立到目标服务器的TCP连接
4. 代理服务器返回 `200 Connection Established` 响应给客户端
5. 客户端开始TLS握手,与目标服务器建立加密连接
6. 代理服务器在客户端和目标服务器之间透明转发加密数据

## 支持的请求类型

- **HTTP请求**: GET, POST, HEAD, 其他HTTP方法
- **HTTPS请求**: 通过CONNECT隧道建立加密连接

## 目标地址解析

代理服务器会自动从以下位置解析目标地址:
1. HTTP请求的 `Host`2. 请求行中的URL(如 `GET http://example.com/path``GET https://example.com/path`3. CONNECT请求中的目标地址(如 `CONNECT example.com:443`
## HTTPS支持说明

### CONNECT隧道方法
这是标准的HTTPS代理工作方式:
1. 客户端发送 `CONNECT` 请求到代理
2. 代理建立到目标服务器的TCP连接
3. 代理返回成功响应
4. 客户端与目标服务器直接进行TLS握手
5. 代理透明转发加密数据

### 优点:
- 代理不需要处理TLS加密/解密
- 客户端和目标服务器的通信保持端到端加密
- 符合HTTP代理标准

### 注意事项:
- HTTPS代理使用CONNECT隧道,代理只看到加密数据
- 需要客户端支持HTTP代理协议
- 默认HTTPS端口是443
- 建议在测试环境中使用
- 生产环境需要添加更多安全性和性能优化

## 测试网站

可以使用以下网站测试代理功能:
- http://httpbin.org/get - 返回请求信息
- http://example.com - 简单的示例网站
- http://httpbin.org/headers - 返回请求头信息