From 0a91d829289dcf8248eccd1fb5cb8ad9c747db17 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Sun, 26 Apr 2026 21:52:17 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=E7=A7=BB=E9=99=A4=20Baidu=20filesystem=20?= =?UTF-8?q?=E5=AF=B9=E5=85=A8=E5=B1=80=20DNR=20=E8=A7=84=E5=88=99=E7=9A=84?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=EF=BC=8C=E6=94=B9=E4=B8=BA=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E7=BA=A7=E7=A6=81=E7=94=A8=20cookie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/filesystem/baidu/baidu.test.ts | 28 ++++++++++++++++++++++++ packages/filesystem/baidu/baidu.ts | 29 ++----------------------- 2 files changed, 30 insertions(+), 27 deletions(-) create mode 100644 packages/filesystem/baidu/baidu.test.ts diff --git a/packages/filesystem/baidu/baidu.test.ts b/packages/filesystem/baidu/baidu.test.ts new file mode 100644 index 000000000..906b3c2f1 --- /dev/null +++ b/packages/filesystem/baidu/baidu.test.ts @@ -0,0 +1,28 @@ +import { describe, expect, it, vi, afterEach } from "vitest"; +import BaiduFileSystem from "./baidu"; + +describe("BaiduFileSystem", () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("request should omit credentials without using global DNR rules", async () => { + const fetchMock = vi.fn().mockResolvedValue({ + json: async () => ({ errno: 0 }), + }); + vi.stubGlobal("fetch", fetchMock); + const fs = new BaiduFileSystem("/apps", "token"); + + await expect(fs.request("https://pan.baidu.com/rest/2.0/xpan/file?method=list")).resolves.toEqual({ + errno: 0, + }); + + expect(fetchMock).toHaveBeenCalledTimes(1); + expect(fetchMock).toHaveBeenCalledWith( + "https://pan.baidu.com/rest/2.0/xpan/file?method=list", + expect.objectContaining({ + credentials: "omit", + }) + ); + }); +}); diff --git a/packages/filesystem/baidu/baidu.ts b/packages/filesystem/baidu/baidu.ts index d1c7a04dd..9184de2f0 100644 --- a/packages/filesystem/baidu/baidu.ts +++ b/packages/filesystem/baidu/baidu.ts @@ -59,29 +59,9 @@ export default class BaiduFileSystem implements FileSystem { async request(url: string, config?: RequestInit) { config = config || {}; const headers = config.headers || new Headers(); - // 处理请求匿名不发送cookie - await chrome.declarativeNetRequest.updateDynamicRules({ - removeRuleIds: [100], - addRules: [ - { - id: 100, - action: { - type: "modifyHeaders", - responseHeaders: [ - { - operation: "remove", - header: "cookie", - }, - ], - }, - condition: { - urlFilter: url, - resourceTypes: ["xmlhttprequest"], - }, - }, - ], - }); config.headers = headers; + // 对百度网盘请求显式禁用 cookie,避免依赖全局 DNR 规则造成并发竞态 + config.credentials = "omit"; return fetch(url, config) .then((data) => data.json()) .then(async (data) => { @@ -99,11 +79,6 @@ export default class BaiduFileSystem implements FileSystem { }); } return data; - }) - .finally(() => { - chrome.declarativeNetRequest.updateDynamicRules({ - removeRuleIds: [100], - }); }); } From 8f0eb0d4752144b30c834bd4f442fcb584e2390d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E4=B9=8B?= Date: Mon, 27 Apr 2026 14:24:06 +0800 Subject: [PATCH 2/2] =?UTF-8?q?test:=20=E4=BF=AE=E6=AD=A3=20baidu=20?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=9A=84=20stub=20=E6=B8=85=E7=90=86?= =?UTF-8?q?=E4=B8=8E=20DNR=20=E6=96=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - afterEach 增加 vi.unstubAllGlobals() 以还原 stubGlobal 注入的 fetch - 显式断言 chrome.declarativeNetRequest.updateDynamicRules 未被调用, 防止未来误回退到全局 DNR 规则方案时测试仍然通过 --- packages/filesystem/baidu/baidu.test.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/filesystem/baidu/baidu.test.ts b/packages/filesystem/baidu/baidu.test.ts index 906b3c2f1..4ca661f89 100644 --- a/packages/filesystem/baidu/baidu.test.ts +++ b/packages/filesystem/baidu/baidu.test.ts @@ -3,6 +3,7 @@ import BaiduFileSystem from "./baidu"; describe("BaiduFileSystem", () => { afterEach(() => { + vi.unstubAllGlobals(); vi.restoreAllMocks(); }); @@ -11,6 +12,11 @@ describe("BaiduFileSystem", () => { json: async () => ({ errno: 0 }), }); vi.stubGlobal("fetch", fetchMock); + + // 监视 updateDynamicRules,确保不再依赖全局 DNR 规则 + const updateDynamicRulesMock = vi.fn(); + (chrome as any).declarativeNetRequest.updateDynamicRules = updateDynamicRulesMock; + const fs = new BaiduFileSystem("/apps", "token"); await expect(fs.request("https://pan.baidu.com/rest/2.0/xpan/file?method=list")).resolves.toEqual({ @@ -24,5 +30,6 @@ describe("BaiduFileSystem", () => { credentials: "omit", }) ); + expect(updateDynamicRulesMock).not.toHaveBeenCalled(); }); });