From cbb2006e47d055f42d6d42bd9b850817e00fb0d1 Mon Sep 17 00:00:00 2001 From: naiy Date: Fri, 31 Jul 2026 04:06:11 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=9B=A0=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E6=8B=A6=E6=88=AA=E6=B2=A1=E6=9C=89=20resolve=20?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84=E9=A1=B5=E9=9D=A2=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E5=8D=A1=E6=AD=BB=E4=B8=8D=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/fetchHook.ts | 70 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/src/hooks/fetchHook.ts b/src/hooks/fetchHook.ts index 1159def..ea364db 100644 --- a/src/hooks/fetchHook.ts +++ b/src/hooks/fetchHook.ts @@ -9,6 +9,12 @@ const blackList = [ 'hm.baidu.com' ] +const BLOCKED_BODY = JSON.stringify({ + e: 0, + sc: 10, + tc: 10 +}) + function checkBlack(url: string): boolean { return blackList.some(black => url.includes(black)) } @@ -28,9 +34,10 @@ unsafeWindow.fetch = function fetch(input: RequestInfo | URL, init?: RequestInit if (checkBlack(url)) { console.log('blocked request: ' + url) - return new Promise(() => { - return new Response('{}', { status: 403 }) - }) + return Promise.resolve(new Response(BLOCKED_BODY, { + status: 200, + headers: { 'Content-Type': 'application/json' }, + })) } return originalFetch(input, init) @@ -39,13 +46,64 @@ unsafeWindow.fetch = function fetch(input: RequestInfo | URL, init?: RequestInit const originalXMLHttpRequest = unsafeWindow.XMLHttpRequest unsafeWindow.XMLHttpRequest = class XMLHttpRequest extends originalXMLHttpRequest { + private _blockedUrl?: string + open(method: string, url: string, async: boolean = true, user?: string | null, password?: string | null): void { if (checkBlack(url)) { console.log('blocked request: ' + url) - this.abort() - } else { - super.open(method, url, async, user, password) + this._blockedUrl = url + return } + this._blockedUrl = undefined + super.open(method, url, async, user, password) + } + + setRequestHeader(name: string, value: string): void { + if (this._blockedUrl !== undefined) return + super.setRequestHeader(name, value) + } + + send(body?: Document | XMLHttpRequestBodyInit | null): void { + if (this._blockedUrl === undefined) { + super.send(body) + return + } + const url = this._blockedUrl + const shadow = (prop: string, value: unknown) => + Object.defineProperty(this, prop, { configurable: true, get: () => value }) + + setTimeout(() => { + shadow('readyState', 4) + shadow('status', 200) + shadow('statusText', 'OK') + shadow('responseURL', url) + shadow('responseText', this.responseType === '' || this.responseType === 'text' ? BLOCKED_BODY : '') + shadow('response', this.responseType === 'json' ? { + "e": 0, + "sc": 10, + "tc": 10 + } : BLOCKED_BODY) + this.dispatchEvent(new Event('readystatechange')) + this.dispatchEvent(new ProgressEvent('load')) + this.dispatchEvent(new ProgressEvent('loadend')) + }, 0) + } + + abort(): void { + if (this._blockedUrl !== undefined) return + super.abort() + } + + getAllResponseHeaders(): string { + if (this._blockedUrl !== undefined) return 'content-type: application/json\r\n' + return super.getAllResponseHeaders() + } + + getResponseHeader(name: string): string | null { + if (this._blockedUrl !== undefined) { + return name.toLowerCase() === 'content-type' ? 'application/json' : null + } + return super.getResponseHeader(name) } }