带阿里标识的版本
This commit is contained in:
@@ -1,78 +1,78 @@
|
||||
# HTTP Mock Server for Integration Tests
|
||||
|
||||
本目录包含用于 `HttpdnsNWHTTPClient` 集成测试的 HTTP/HTTPS mock server,用于替代 httpbin.org。
|
||||
本目录包含用<EFBFBD><EFBFBD>?`HttpdnsNWHTTPClient` 集成测试<EFBFBD><EFBFBD>?HTTP/HTTPS mock server,用于替<EFBFBD><EFBFBD>?httpbin.org<EFBFBD><EFBFBD>?
|
||||
|
||||
---
|
||||
|
||||
## 为什么需要 Mock Server?
|
||||
## 为什么需<EFBFBD><EFBFBD>?Mock Server<EFBFBD><EFBFBD>?
|
||||
|
||||
1. **可靠性**: httpbin.org 在高并发测试下表现不稳定,经常返回非预期的 HTTP 状态码(如 429 Too Many Requests)
|
||||
1. **可靠<EFBFBD><EFBFBD>?*: httpbin.org 在高并发测试下表现不稳定,经常返回非预期<EFBFBD><EFBFBD>?HTTP 状态码(如 429 Too Many Requests<EFBFBD><EFBFBD>?
|
||||
2. **速度**: 本地服务器响应更快,缩短测试执行时间
|
||||
3. **离线测试**: 无需网络连接即可运行集成测试
|
||||
4. **可控性**: 完全掌控测试环境,便于调试和复现问题
|
||||
4. **可控<EFBFBD><EFBFBD>?*: 完全掌控测试环境,便于调试和复现问题
|
||||
|
||||
---
|
||||
|
||||
## 快速开始
|
||||
## 快速开<EFBFBD><EFBFBD>?
|
||||
|
||||
### 1. 启动 Mock Server
|
||||
|
||||
```bash
|
||||
# 进入测试目录
|
||||
cd AlicloudHttpDNSTests/Network
|
||||
cd TrustHttpDNSTests/Network
|
||||
|
||||
# 启动服务器(无需 sudo 权限,使用非特权端口)
|
||||
# 启动服务器(无需 sudo 权限,使用非特权端口<EFBFBD><EFBFBD>?
|
||||
python3 mock_server.py
|
||||
```
|
||||
|
||||
**注意**:
|
||||
- **无需 root 权限**(使用非特权端口 11080/11443-11446)
|
||||
- **无需 root 权限**(使用非特权端口 11080/11443-11446<EFBFBD><EFBFBD>?
|
||||
- 首次运行会自动生成自签名证书 (`server.pem`)
|
||||
- 按 `Ctrl+C` 停止服务器
|
||||
- <EFBFBD><EFBFBD>?`Ctrl+C` 停止服务<EFBFBD><EFBFBD>?
|
||||
|
||||
### 2. 运行集成测试
|
||||
|
||||
在另一个终端窗口:
|
||||
在另一个终端窗<EFBFBD><EFBFBD>?
|
||||
|
||||
```bash
|
||||
cd ~/Project/iOS/alicloud-ios-sdk-httpdns
|
||||
cd ~/Project/iOS/Trust-ios-sdk-httpdns
|
||||
|
||||
# 运行所有集成测试
|
||||
# 运行所有集成测<EFBFBD><EFBFBD>?
|
||||
xcodebuild test \
|
||||
-workspace AlicloudHttpDNS.xcworkspace \
|
||||
-scheme AlicloudHttpDNSTests \
|
||||
-workspace TrustHttpDNS.xcworkspace \
|
||||
-scheme TrustHttpDNSTests \
|
||||
-destination 'platform=iOS Simulator,name=iPhone 15' \
|
||||
-only-testing:AlicloudHttpDNSTests/HttpdnsNWHTTPClientIntegrationTests
|
||||
-only-testing:TrustHttpDNSTests/HttpdnsNWHTTPClientIntegrationTests
|
||||
|
||||
# 运行单个测试
|
||||
xcodebuild test \
|
||||
-workspace AlicloudHttpDNS.xcworkspace \
|
||||
-scheme AlicloudHttpDNSTests \
|
||||
-workspace TrustHttpDNS.xcworkspace \
|
||||
-scheme TrustHttpDNSTests \
|
||||
-destination 'platform=iOS Simulator,name=iPhone 15' \
|
||||
-only-testing:AlicloudHttpDNSTests/HttpdnsNWHTTPClientIntegrationTests/testConcurrency_ParallelRequestsSameHost_AllSucceed
|
||||
-only-testing:TrustHttpDNSTests/HttpdnsNWHTTPClientIntegrationTests/testConcurrency_ParallelRequestsSameHost_AllSucceed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 支持的 Endpoints
|
||||
## 支持<EFBFBD><EFBFBD>?Endpoints
|
||||
|
||||
Mock server 实现了以下 httpbin.org 兼容的 endpoints:
|
||||
Mock server 实现了以<EFBFBD><EFBFBD>?httpbin.org 兼容<EFBFBD><EFBFBD>?endpoints:
|
||||
|
||||
| Endpoint | 功能 | 示例 |
|
||||
|----------|------|------|
|
||||
| `GET /get` | 返回请求信息(headers, args, origin) | `http://127.0.0.1:11080/get` |
|
||||
| `GET /status/{code}` | 返回指定状态码(100-599) | `http://127.0.0.1:11080/status/404` |
|
||||
| `GET /stream-bytes/{n}` | 返回 chunked 编码的 N 字节数据 | `http://127.0.0.1:11080/stream-bytes/1024` |
|
||||
| `GET /delay/{seconds}` | 延迟指定秒数后返回(最多10秒) | `http://127.0.0.1:11080/delay/5` |
|
||||
| `GET /headers` | 返回所有请求头部 | `http://127.0.0.1:11080/headers` |
|
||||
| `GET /get` | 返回请求信息(headers, args, origin<EFBFBD><EFBFBD>?| `http://127.0.0.1:11080/get` |
|
||||
| `GET /status/{code}` | 返回指定状态码<EFBFBD><EFBFBD>?00-599<EFBFBD><EFBFBD>?| `http://127.0.0.1:11080/status/404` |
|
||||
| `GET /stream-bytes/{n}` | 返回 chunked 编码<EFBFBD><EFBFBD>?N 字节数据 | `http://127.0.0.1:11080/stream-bytes/1024` |
|
||||
| `GET /delay/{seconds}` | 延迟指定秒数后返回(最<EFBFBD><EFBFBD>?0秒) | `http://127.0.0.1:11080/delay/5` |
|
||||
| `GET /headers` | 返回所有请求头<EFBFBD><EFBFBD>?| `http://127.0.0.1:11080/headers` |
|
||||
| `GET /uuid` | 返回随机 UUID | `http://127.0.0.1:11080/uuid` |
|
||||
| `GET /user-agent` | 返回 User-Agent 头部 | `http://127.0.0.1:11080/user-agent` |
|
||||
|
||||
**端口配置**:
|
||||
- **HTTP**: `127.0.0.1:11080`
|
||||
- **HTTPS**: `127.0.0.1:11443`, `11444`, `11445`, `11446`(4个端口用于测试连接池隔离)
|
||||
- **HTTPS**: `127.0.0.1:11443`, `11444`, `11445`, `11446`<EFBFBD><EFBFBD>?个端口用于测试连接池隔离<EFBFBD><EFBFBD>?
|
||||
|
||||
所有 endpoints 在 HTTP 和 HTTPS 端口上均可访问。
|
||||
所<EFBFBD><EFBFBD>?endpoints <EFBFBD><EFBFBD>?HTTP <EFBFBD><EFBFBD>?HTTPS 端口上均可访问<EFBFBD><EFBFBD>?
|
||||
|
||||
---
|
||||
|
||||
@@ -80,25 +80,25 @@ Mock server 实现了以下 httpbin.org 兼容的 endpoints:
|
||||
|
||||
### 架构
|
||||
|
||||
- **HTTP 服务器**: 监听 `127.0.0.1:11080`
|
||||
- **HTTPS 服务器**: 监听 `127.0.0.1:11443`, `11444`, `11445`, `11446`(4个端口,使用自签名证书)
|
||||
- **多端口目的**: 测试连接池的端口隔离机制,确保不同端口使用独立的连接池
|
||||
- **并发模型**: 多线程(`ThreadingMixIn`),支持高并发请求
|
||||
- **HTTP 服务<EFBFBD><EFBFBD>?*: 监听 `127.0.0.1:11080`
|
||||
- **HTTPS 服务<EFBFBD><EFBFBD>?*: 监听 `127.0.0.1:11443`, `11444`, `11445`, `11446`<EFBFBD><EFBFBD>?个端口,使用自签名证书)
|
||||
- **多端口目<EFBFBD><EFBFBD>?*: 测试连接池的端口隔离机制,确保不同端口使用独立的连接<EFBFBD><EFBFBD>?
|
||||
- **并发模型**: 多线程(`ThreadingMixIn`),支持高并发请<EFBFBD><EFBFBD>?
|
||||
|
||||
### TLS 证书
|
||||
|
||||
- 自动生成自签名证书(RSA 2048位,有效期 365 天)
|
||||
- 自动生成自签名证书(RSA 2048位,有效<EFBFBD><EFBFBD>?365 天)
|
||||
- CN (Common Name): `localhost`
|
||||
- 证书文件: `server.pem`(同时包含密钥和证书)
|
||||
- 证书文件: `server.pem`(同时包含密钥和证书<EFBFBD><EFBFBD>?
|
||||
|
||||
**重要**: 集成测试通过环境变量 `HTTPDNS_SKIP_TLS_VERIFY=1` 跳过 TLS 验证,这是安全的,因为:
|
||||
1. 仅在测试环境生效
|
||||
2. 不影响生产代码
|
||||
3. 连接限制为本地 loopback (127.0.0.1)
|
||||
2. 不影响生产代<EFBFBD><EFBFBD>?
|
||||
3. 连接限制为本<EFBFBD><EFBFBD>?loopback (127.0.0.1)
|
||||
|
||||
### 响应格式
|
||||
|
||||
所有 JSON 响应遵循 httpbin.org 格式,例如:
|
||||
所<EFBFBD><EFBFBD>?JSON 响应遵循 httpbin.org 格式,例<EFBFBD><EFBFBD>?
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -131,7 +131,7 @@ XXXXXXXXXX
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
✗ 端口 80 已被占用,请关闭占用端口的进程或使用其他端口
|
||||
<EFBFBD><EFBFBD>?端口 80 已被占用,请关闭占用端口的进程或使用其他端口
|
||||
```
|
||||
|
||||
**解决方法**:
|
||||
@@ -147,9 +147,9 @@ sudo lsof -i :443
|
||||
sudo kill -9 <PID>
|
||||
```
|
||||
|
||||
3. 或修改 mock_server.py 使用其他端口:
|
||||
3. 或修<EFBFBD><EFBFBD>?mock_server.py 使用其他端口:
|
||||
```python
|
||||
# 修改端口号(同时需要更新测试代码中的 URL)
|
||||
# 修改端口号(同时需要更新测试代码中<EFBFBD><EFBFBD>?URL<52><4C>?
|
||||
run_http_server(port=8080)
|
||||
run_https_server(port=8443)
|
||||
```
|
||||
@@ -158,13 +158,13 @@ run_https_server(port=8443)
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
✗ 未找到 openssl 命令,请安装 OpenSSL
|
||||
<EFBFBD><EFBFBD>?未找<E69CAA><E689BE>?openssl 命令,请安装 OpenSSL
|
||||
```
|
||||
|
||||
**解决方法**:
|
||||
|
||||
```bash
|
||||
# macOS (通常已预装)
|
||||
# macOS (通常已预<EFBFBD><EFBFBD>?
|
||||
brew install openssl
|
||||
|
||||
# Ubuntu/Debian
|
||||
@@ -174,11 +174,11 @@ sudo apt-get install openssl
|
||||
sudo yum install openssl
|
||||
```
|
||||
|
||||
### 权限被拒绝
|
||||
### 权限被拒<EFBFBD><EFBFBD>?
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
✗ 错误: 需要 root 权限以绑定 80/443 端口
|
||||
<EFBFBD><EFBFBD>?错误: 需<EFBFBD><EFBFBD>?root 权限以绑<EFBFBD><EFBFBD>?80/443 端口
|
||||
```
|
||||
|
||||
**解决方法**:
|
||||
@@ -190,21 +190,21 @@ sudo python3 mock_server.py
|
||||
|
||||
---
|
||||
|
||||
## 切换回 httpbin.org
|
||||
## 切换<EFBFBD><EFBFBD>?httpbin.org
|
||||
|
||||
如需使用真实的 httpbin.org 进行测试(例如验证兼容性):
|
||||
如需使用真实<EFBFBD><EFBFBD>?httpbin.org 进行测试(例如验证兼容性):
|
||||
|
||||
1. 编辑 `HttpdnsNWHTTPClientIntegrationTests.m`
|
||||
2. 将所有 `127.0.0.1` 替换回 `httpbin.org`
|
||||
3. 注释掉 setUp/tearDown 中的环境变量设置
|
||||
2. 将所<EFBFBD><EFBFBD>?`127.0.0.1` 替换<EFBFBD><EFBFBD>?`httpbin.org`
|
||||
3. 注释<EFBFBD><EFBFBD>?setUp/tearDown 中的环境变量设置
|
||||
|
||||
---
|
||||
|
||||
## 开发与扩展
|
||||
|
||||
### 添加新 Endpoint
|
||||
### 添加<EFBFBD><EFBFBD>?Endpoint
|
||||
|
||||
在 `mock_server.py` 的 `MockHTTPHandler.do_GET()` 方法中添加:
|
||||
<EFBFBD><EFBFBD>?`mock_server.py` <EFBFBD><EFBFBD>?`MockHTTPHandler.do_GET()` 方法中添<EFBFBD><EFBFBD>?
|
||||
|
||||
```python
|
||||
def do_GET(self):
|
||||
@@ -215,14 +215,14 @@ def do_GET(self):
|
||||
# ... 其他 endpoints
|
||||
|
||||
def _handle_your_endpoint(self):
|
||||
"""处理自定义 endpoint"""
|
||||
"""处理自定<EFBFBD><EFBFBD>?endpoint"""
|
||||
data = {'custom': 'data'}
|
||||
self._send_json(200, data)
|
||||
```
|
||||
|
||||
### 调试模式
|
||||
|
||||
取消注释 `log_message` 方法以启用详细日志:
|
||||
取消注释 `log_message` 方法以启用详细日<EFBFBD><EFBFBD>?
|
||||
|
||||
```python
|
||||
def log_message(self, format, *args):
|
||||
@@ -234,20 +234,20 @@ def log_message(self, format, *args):
|
||||
## 技术栈
|
||||
|
||||
- **Python 3.7+** (标准库,无需额外依赖)
|
||||
- **http.server**: HTTP 服务器实现
|
||||
- **http.server**: HTTP 服务器实<EFBFBD><EFBFBD>?
|
||||
- **ssl**: TLS/SSL 支持
|
||||
- **socketserver.ThreadingMixIn**: 多线程并发
|
||||
- **socketserver.ThreadingMixIn**: 多线程并<EFBFBD><EFBFBD>?
|
||||
|
||||
---
|
||||
|
||||
## 安全注意事项
|
||||
|
||||
1. **仅用于测试**: 此服务器设计用于本地测试,不适合生产环境
|
||||
2. **自签名证书**: HTTPS 使用不受信任的自签名证书
|
||||
3. **无身份验证**: 不实现任何身份验证机制
|
||||
4. **本地绑定**: 服务器仅绑定到 `127.0.0.1`,不接受外部连接
|
||||
1. **仅用于测<EFBFBD><EFBFBD>?*: 此服务器设计用于本地测试,不适合生产环境
|
||||
2. **自签名证<EFBFBD><EFBFBD>?*: HTTPS 使用不受信任的自签名证书
|
||||
3. **无身份验<EFBFBD><EFBFBD>?*: 不实现任何身份验证机<EFBFBD><EFBFBD>?
|
||||
4. **本地绑定**: 服务器仅绑定<EFBFBD><EFBFBD>?`127.0.0.1`,不接受外部连接
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2025-11-01
|
||||
**维护者**: Claude Code
|
||||
**最后更<EFBFBD><EFBFBD>?*: 2025-11-01
|
||||
**维护<EFBFBD><EFBFBD>?*: Claude Code
|
||||
|
||||
Reference in New Issue
Block a user