Repository navigation
v0.8.1
修复
明文 HTTP 响应头块缺终止空行(#9):经中继返回的明文 HTTP 响应在头块末尾只有一个 CRLF,响应体(分块长度)被客户端当成头字段解析——curl 报 curl: (8) Header without colon、web_fetch 报 TypeError: fetch failed,且收到 0 字节。现补上终止空行(CRLFCRLF)。HTTPS 走 CONNECT 隧道、原始字节透传,不受此影响。
同一路径上会让头字段失真的几处一并修掉:
- 响应头原先塞进普通对象,多个
Set-Cookie只剩最后一个 → 同名头改为按出现顺序累积,逐个写出,顺序不变; 1xx/204/304与HEAD没有消息体,原先仍按 CL/chunked/EOF 去读,会挂到上游关流或误报截断 → 头之后直接收尾;- 响应侧重复调用
stripHop()会多写一条connection: close→ 响应侧不再调用;stripHop另补剥逐跳头te、trailer; fetch通道(lib/proxy/http11.js)同样用对象收头,且以new Headers(hdrs)重建响应,数组值会被拼成"a,b"一条 → 改为逐次append,getSetCookie()能拿到全部值。
新增
代理请求超时可配置(#8):timeout 此前会被 toProxy() 丢弃,保存 300000 仍按 60 秒走。现接通配置到请求层,并在设置页加入以秒编辑的输入框。默认仍为 60 秒,校验限制 1–2147483647 整数毫秒;非法提交不落盘,旧配置中的非法值只回退该字段,不会因此关闭代理。
验证
- 先抓原始字节复现:修复前
...chunked\r\n4\r\nBODY,修复后...chunked\r\n\r\n4\r\nBODY。 - 响应头相关新用例均经「还原修复 → 必须失败」反向确认(旧代码下多
Set-Cookie得到合并成一条的a=1; Path=/,b=2; Path=/,c=3; Path=/)。 - 全量 160 项通过,
eslint .干净。
说明
本次为 patch 版本。超时配置属新增能力,按语义化版本应走 minor,但 0.8.x 尚未累计到需要跳号的变更,故与修复同版发出。
npm ci 在本地会因 @eslint/js@10 与锁定的 eslint 9 冲突报 ERESOLVE(既有问题,与本次改动无关),CI 与 release workflow 已用 --legacy-peer-deps 绕过。