diff --git a/packages/filesystem/baidu/baidu.test.ts b/packages/filesystem/baidu/baidu.test.ts new file mode 100644 index 000000000..4ca661f89 --- /dev/null +++ b/packages/filesystem/baidu/baidu.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, it, vi, afterEach } from "vitest"; +import BaiduFileSystem from "./baidu"; + +describe("BaiduFileSystem", () => { + afterEach(() => { + vi.unstubAllGlobals(); + 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); + + // 监视 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({ + errno: 0, + }); + + expect(fetchMock).toHaveBeenCalledTimes(1); + expect(fetchMock).toHaveBeenCalledWith( + "https://pan.baidu.com/rest/2.0/xpan/file?method=list", + expect.objectContaining({ + credentials: "omit", + }) + ); + expect(updateDynamicRulesMock).not.toHaveBeenCalled(); + }); +}); 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], - }); }); }