模拟响应
Chute 可以为匹配的 HTTP/HTTPS 请求返回模拟数据。对于已解密的 HTTP/2 流,模拟响应会在本地直接应答,不再转发该请求;对于 HTTP/1.1 请求(普通代理和 MitM HTTP/1.1),请求仍会被发送到真实服务器,真实响应在到达客户端之前会被替换为模拟数据。这对于测试、开发或用自定义响应阻止不需要的内容非常有用。
模拟响应规则定义在 [Map Local] 段中。
每个请求只会应用一条模拟响应规则——即第一条 URL 模式匹配的规则。
Map Local 格式
用于从本地文件、内联文本或 base64 编码内容提供模拟响应,并可指定状态码和响应头:
[Map Local]
^https://example\.com/api.* data="/path/to/mock-response.json"
^https://example\.com/page.* data="/path/to/page.html" header="SGVhZGVyOiBWYWx1ZQ=="
^https://example\.com/pixel.* base64="R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
^https://example\.com/api/v2.* data-type=text data="rate limited" status-code=429 header="Content-Type: text/plain|Retry-After: 30"
^https://example\.com/beacon.* data-type=tiny-gif
注意:正则表达式在请求完整 URL 的任意位置匹配——解密后是
https://…,Chute 作为普通 HTTP 代理时是http://…——所以^https://example\.com已覆盖该主机下的所有路径和查询字符串,无需在结尾加.*。它从不单独拿路径去匹配,所以^/api这样的模式不会命中。模式会保留原本的大小写,因此\S、\D、\W、\B的含义不会被改变;匹配本身不区分大小写。
位于行首或紧跟在空格后面的 # 或 // 会开启一段注释,一直到行尾,除非它在双引号之内;; 从不算注释。见注释。
Map Local 参数
| 参数 | 说明 | |||
|---|---|---|---|---|
data="/path/to/file" |
用作响应正文的文件路径,在请求时读取;配合 data-type 时则是正文本身(见下)。 |
|||
| `data-type=file\ | text\ | base64\ | tiny-gif` | data= 的读取方式:file 为文件路径(默认);text 为值本身即正文;base64 为对值做 base64 解码;tiny-gif 为内置的 1×1 GIF,无需 data=(未用 header= 设置 Content-Type 时以 image/gif 发送)。 |
base64="<encoded>" |
Base64 编码的响应正文内容(等同于 data-type=base64)。 |
|||
status-code=<code> |
模拟响应的状态码,范围 200–599,默认 200。超出范围时整行无效,作为配置错误报告。 |
|||
| `header="Key: value\ | Key2: value2"` | 自定义响应头。多个头以 `\ | 分隔,每一对在第一个冒号处拆分,因此值本身可以包含冒号(如 URL)。旧的 base64 形式(base64 编码的Key:Value\n` 行)仍然可用。 |
规则需要有正文来源:
data=(文件,或配合data-type的文本 / base64)、base64=或data-type=tiny-gif;只写data-type=text而不写data=会得到空正文。无法产生正文的规则(没有正文参数,或文件读不到)不会作答:请求照常发往服务器,后面的模拟响应规则也不会再尝试。注意:两种形式下,每个头都在第一个冒号处拆分,名称和值两端的空格会被去掉;没有冒号的行会被忽略。
Chute 自己生成的应答——模拟响应(Map Local)、脚本的
response,以及 URL 重写和 REJECT 类策略的应答与错误页——遵守 HTTP:对 HEAD 请求的应答只有头部,其中的 Content-Length 与 GET 得到的相同;状态码为 204、205 或 304 的应答既不带正文,也不带 Content-Length。
模板变量
使用 data= 或 base64= 时,响应正文支持模板变量替换:
| 变量 | 替换为 |
|---|---|
{{url}} |
完整的请求 URL,也就是规则看到的那个 |
{{host}} |
请求的主机名 |
{{path}} |
相对 URL 路径 |
{{method}} |
HTTP 方法 |
{{ua}} |
User-Agent 头部值 |
示例模拟响应文件(response.json):
{
"requested_url": "{{ "{{url}}" }}",
"host": "{{ "{{host}}" }}",
"method": "{{ "{{method}}" }}"
}
注意:对于 HTTPS 请求,必须为匹配的主机名启用 MitM 解密。未启用 MitM 的 HTTPS 流量的模拟响应规则将被忽略。明文 HTTP 请求只有经由 Chute 的 HTTP 代理到达时才会由模拟响应规则应答;经 TUN 接口到达的明文 HTTP 会被原样转发。Chute Android 让所有流量都经过 TUN,除非在设置中打开了系统 HTTP 代理,它会把 Chute 的 HTTP 代理交给应用使用(Android 10 及以上;默认关闭)。
注意:
data=指向的文件由运行 Chute 的设备在请求时读取。从 Chute Dashboard 给 iPhone 添加模拟响应规则时,Mac 上的路径对手机毫无意义——改用base64=把内容内联进去,或者把文件放到某个 URL 上并使用 URL 重写。
本页为英文版的翻译。如内容有出入,以英文版为准。