带阿里标识的版本

This commit is contained in:
robin
2026-02-28 18:55:33 +08:00
parent 150799f41d
commit 5d0b7c7e91
477 changed files with 10813 additions and 4044 deletions

View File

@@ -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