Skip to content

(Codex) 移除 Baidu filesystem 对全局 DNR 规则的依赖,改为请求级禁用 cookie#1377

Merged
CodFrm merged 2 commits intomainfrom
fix/sync/004
Apr 27, 2026
Merged

(Codex) 移除 Baidu filesystem 对全局 DNR 规则的依赖,改为请求级禁用 cookie#1377
CodFrm merged 2 commits intomainfrom
fix/sync/004

Conversation

@cyfung1031
Copy link
Copy Markdown
Collaborator

背景

packages/filesystem/baidu/baidu.ts 里原本为了让百度网盘请求“不带 cookie”,使用了 chrome.declarativeNetRequest.updateDynamicRules() 动态增删一条全局规则。

这套做法有两个核心问题:

  1. 它依赖浏览器全局共享状态,而不是请求自身配置
  2. 它使用固定 rule id,在并发请求下会产生竞态

在同步场景里,这意味着:

  • 一个请求还没结束,另一个请求可能已经覆盖或移除了规则
  • 请求是否真的不带 cookie,会变成时序相关行为
  • 分页列目录、连续上传、并发同步时更容易出现偶发异常

这类问题不一定每次都复现,但一旦出现,会非常难排查。


本次修改

修改文件

  • packages/filesystem/baidu/baidu.ts

修改内容

  • 删除请求前的 chrome.declarativeNetRequest.updateDynamicRules(...)
  • 删除请求完成后的动态规则清理逻辑
  • 改为在 Baidu 请求中直接设置:
    • credentials: "omit"

修改意图

这次不是改变 Baidu 请求的业务语义,而是把“不要带 cookie”从全局副作用改成请求内显式行为

核心意图:

  1. 保留原始目标

    • 仍然是不带 cookie 访问百度网盘接口
  2. 去掉全局共享状态

    • 不再依赖动态 DNR 规则
    • 不再依赖固定 rule id
  3. 消除并发竞态

    • 每个请求自己决定是否带 cookie
    • 请求之间互不影响

为什么这样改

原实现的问题,不是“是否禁用 cookie”,而是“禁用 cookie 的方式不安全”。

用全局 DNR 规则做这件事,会把一个本该属于单请求配置的问题,扩大成浏览器层面的共享状态问题。

这在以下场景中尤其危险:

  • 多个 Baidu API 请求并发
  • 同步过程中连续分页请求
  • 上传、删除、列目录交错发生
  • 网络不稳定导致请求耗时拉长

改成 credentials: "omit" 后:

  • 行为更直接
  • 作用域更小
  • 并发更安全
  • 也更符合 fetch 本身的语义

测试

新增测试

  • packages/filesystem/baidu/baidu.test.ts

覆盖内容

  • Baidu 请求会显式使用 credentials: "omit"
  • 不再依赖全局 DNR 规则来实现“不带 cookie”

验证结果

  • vitest 通过
  • tsc --noEmit 通过

影响范围

本次改动只影响 Baidu filesystem 请求层的 cookie 处理方式。

不影响:

  • Baidu 文件读写协议
  • token 刷新逻辑
  • 上层同步协议
  • 现有 filesystem 接口签名

预期收益

这次修正后,Baidu filesystem 在同步场景下会更稳定:

  • 请求行为不再依赖全局动态规则
  • 并发请求之间不会互相覆盖或互相清理规则
  • 能减少百度网盘同步中的偶发认证/请求异常
  • 更适合多请求并发和网络抖动场景

总结

这次修的重点不是“新增功能”,而是去掉一个高风险实现方式:

  • 以前:用全局 DNR 规则间接控制请求是否带 cookie
  • 现在:用请求自身的 credentials: "omit" 明确控制

也就是把一个容易竞态、难排查的问题,收敛成单请求内可预期的行为。

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

该 PR 将 Baidu filesystem 中“禁止携带 cookie”的实现从依赖全局 declarativeNetRequest 动态规则,改为在单次请求层面通过 fetchcredentials: "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(() => {
Copy link

Copilot AI Apr 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里使用了 vi.stubGlobal("fetch", ...) 覆盖全局 fetch,但 afterEach 仅调用 vi.restoreAllMocks() 并不会还原 stubGlobal 的全局替换,可能导致后续测试用例继续使用本用例的 fetchMock(产生串扰/偶发失败)。建议在 afterEach 中补充 vi.unstubAllGlobals()(或至少 vi.unstubGlobal("fetch")),必要时再配合 vi.restoreAllMocks()/vi.clearAllMocks()。

Suggested change
afterEach(() => {
afterEach(() => {
vi.unstubAllGlobals();

Copilot uses AI. Check for mistakes.
Comment on lines +9 to +13
it("request should omit credentials without using global DNR rules", async () => {
const fetchMock = vi.fn().mockResolvedValue({
json: async () => ({ errno: 0 }),
});
vi.stubGlobal("fetch", fetchMock);
Copy link

Copilot AI Apr 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

测试用例标题里强调“without using global DNR rules”,但当前断言只覆盖了 fetch 的 credentials: "omit",并没有验证不再调用 chrome.declarativeNetRequest.updateDynamicRules(未来若有人回退/重新引入 DNR 逻辑,此测试仍会通过)。建议在测试中显式为 chrome.declarativeNetRequest 注入/spy updateDynamicRules 并断言其未被调用,以覆盖 PR 的关键目标。

Copilot uses AI. Check for mistakes.
- afterEach 增加 vi.unstubAllGlobals() 以还原 stubGlobal 注入的 fetch
- 显式断言 chrome.declarativeNetRequest.updateDynamicRules 未被调用,
  防止未来误回退到全局 DNR 规则方案时测试仍然通过
@CodFrm CodFrm merged commit 2c56198 into main Apr 27, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants