(Codex) 移除 Baidu filesystem 对全局 DNR 规则的依赖,改为请求级禁用 cookie#1377
Conversation
There was a problem hiding this comment.
Pull request overview
该 PR 将 Baidu filesystem 中“禁止携带 cookie”的实现从依赖全局 declarativeNetRequest 动态规则,改为在单次请求层面通过 fetch 的 credentials: "omit" 显式控制,从而消除并发请求下的全局共享状态与竞态风险,并补充了对应的单元测试。
Changes:
- 移除 Baidu 请求前后对
chrome.declarativeNetRequest.updateDynamicRules()的动态增删规则逻辑 - 在 Baidu 请求中显式设置
config.credentials = "omit" - 新增
BaiduFileSystem.request的测试用例,验证请求会使用credentials: "omit"
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| packages/filesystem/baidu/baidu.ts | 删除全局 DNR 规则依赖,改为在请求级别设置 credentials: "omit" 以避免并发竞态 |
| packages/filesystem/baidu/baidu.test.ts | 新增测试覆盖 Baidu 请求的 credentials: "omit" 行为 |
| import BaiduFileSystem from "./baidu"; | ||
|
|
||
| describe("BaiduFileSystem", () => { | ||
| afterEach(() => { |
There was a problem hiding this comment.
这里使用了 vi.stubGlobal("fetch", ...) 覆盖全局 fetch,但 afterEach 仅调用 vi.restoreAllMocks() 并不会还原 stubGlobal 的全局替换,可能导致后续测试用例继续使用本用例的 fetchMock(产生串扰/偶发失败)。建议在 afterEach 中补充 vi.unstubAllGlobals()(或至少 vi.unstubGlobal("fetch")),必要时再配合 vi.restoreAllMocks()/vi.clearAllMocks()。
| afterEach(() => { | |
| afterEach(() => { | |
| vi.unstubAllGlobals(); |
| it("request should omit credentials without using global DNR rules", async () => { | ||
| const fetchMock = vi.fn().mockResolvedValue({ | ||
| json: async () => ({ errno: 0 }), | ||
| }); | ||
| vi.stubGlobal("fetch", fetchMock); |
There was a problem hiding this comment.
测试用例标题里强调“without using global DNR rules”,但当前断言只覆盖了 fetch 的 credentials: "omit",并没有验证不再调用 chrome.declarativeNetRequest.updateDynamicRules(未来若有人回退/重新引入 DNR 逻辑,此测试仍会通过)。建议在测试中显式为 chrome.declarativeNetRequest 注入/spy updateDynamicRules 并断言其未被调用,以覆盖 PR 的关键目标。
- afterEach 增加 vi.unstubAllGlobals() 以还原 stubGlobal 注入的 fetch - 显式断言 chrome.declarativeNetRequest.updateDynamicRules 未被调用, 防止未来误回退到全局 DNR 规则方案时测试仍然通过
背景
packages/filesystem/baidu/baidu.ts里原本为了让百度网盘请求“不带 cookie”,使用了chrome.declarativeNetRequest.updateDynamicRules()动态增删一条全局规则。这套做法有两个核心问题:
在同步场景里,这意味着:
这类问题不一定每次都复现,但一旦出现,会非常难排查。
本次修改
修改文件
packages/filesystem/baidu/baidu.ts修改内容
chrome.declarativeNetRequest.updateDynamicRules(...)credentials: "omit"修改意图
这次不是改变 Baidu 请求的业务语义,而是把“不要带 cookie”从全局副作用改成请求内显式行为。
核心意图:
保留原始目标
去掉全局共享状态
消除并发竞态
为什么这样改
原实现的问题,不是“是否禁用 cookie”,而是“禁用 cookie 的方式不安全”。
用全局 DNR 规则做这件事,会把一个本该属于单请求配置的问题,扩大成浏览器层面的共享状态问题。
这在以下场景中尤其危险:
改成
credentials: "omit"后:测试
新增测试
packages/filesystem/baidu/baidu.test.ts覆盖内容
credentials: "omit"验证结果
vitest通过tsc --noEmit通过影响范围
本次改动只影响 Baidu filesystem 请求层的 cookie 处理方式。
不影响:
预期收益
这次修正后,Baidu filesystem 在同步场景下会更稳定:
总结
这次修的重点不是“新增功能”,而是去掉一个高风险实现方式:
credentials: "omit"明确控制也就是把一个容易竞态、难排查的问题,收敛成单请求内可预期的行为。