diff --git a/src/background/messages/makeRequest.ts b/src/background/messages/makeRequest.ts index 7cc44fd..118c17a 100644 --- a/src/background/messages/makeRequest.ts +++ b/src/background/messages/makeRequest.ts @@ -2,19 +2,11 @@ import type { PlasmoMessaging } from '@plasmohq/messaging'; import type { BaseRequest } from '~types/request'; import type { BaseResponse } from '~types/response'; -import { setDynamicRules } from '~utils/declarativeNetRequest'; +import { removeDynamicRules, setDynamicRules } from '~utils/declarativeNetRequest'; import { makeFullUrl } from '~utils/fetcher'; import { assertDomainWhitelist } from '~utils/storage'; -type Body = - | { - bodyType: 'string'; - value: string; - } - | { - bodyType: 'FormData' | 'URLSearchParams' | 'object'; - value: Record; - }; +const MAKE_REQUEST_DYNAMIC_RULE = 23498; export interface Request extends BaseRequest { baseUrl?: string; @@ -23,7 +15,8 @@ export interface Request extends BaseRequest { query?: Record; readHeaders?: Record; url: string; - body?: Body; + body?: any; + bodyType: 'string' | 'FormData' | 'URLSearchParams' | 'object'; } type Response = BaseResponse<{ @@ -35,26 +28,26 @@ type Response = BaseResponse<{ }; }>; -const mapBodyToFetchBody = (body: Request['body']): BodyInit => { - if (body?.bodyType === 'FormData') { +const mapBodyToFetchBody = (body: Request['body'], bodyType: Request['bodyType']): BodyInit => { + if (bodyType === 'FormData') { const formData = new FormData(); - Object.entries(body.value).forEach(([key, value]) => { - formData.append(key, value); + Object.entries(body).forEach(([key, value]) => { + formData.append(key, value.toString()); }); return formData; } - if (body?.bodyType === 'URLSearchParams') { + if (bodyType === 'URLSearchParams') { const searchParams = new URLSearchParams(); - Object.entries(body.value).forEach(([key, value]) => { - searchParams.set(key, value); + Object.entries(body).forEach(([key, value]) => { + searchParams.set(key, value.toString()); }); return searchParams; } - if (body?.bodyType === 'object') { - return JSON.stringify(body.value); + if (bodyType === 'object') { + return JSON.stringify(body); } - if (body?.bodyType === 'string') { - return body.value; + if (bodyType === 'string') { + return body; } return undefined; }; @@ -65,7 +58,7 @@ const handler: PlasmoMessaging.MessageHandler> = async (r if (req.body.headers['User-Agent']) { await setDynamicRules({ - ruleId: 23498, + ruleId: MAKE_REQUEST_DYNAMIC_RULE, targetDomains: [new URL(req.body.url).hostname], requestHeaders: { 'User-Agent': req.body.headers['User-Agent'], @@ -76,8 +69,9 @@ const handler: PlasmoMessaging.MessageHandler> = async (r const response = await fetch(makeFullUrl(req.body.url, req.body), { method: req.body.method, headers: req.body.headers, - body: mapBodyToFetchBody(req.body.body), + body: mapBodyToFetchBody(req.body.body, req.body.bodyType), }); + await removeDynamicRules([MAKE_REQUEST_DYNAMIC_RULE]); const contentType = response.headers.get('content-type'); const body = contentType?.includes('application/json') ? await response.json() : await response.text(); diff --git a/src/utils/declarativeNetRequest.ts b/src/utils/declarativeNetRequest.ts index 15be683..5dac227 100644 --- a/src/utils/declarativeNetRequest.ts +++ b/src/utils/declarativeNetRequest.ts @@ -108,3 +108,10 @@ export const setDynamicRules = async (body: DynamicRule) => { if (browser.runtime.lastError?.message) throw new Error(browser.runtime.lastError.message); } }; + +export const removeDynamicRules = async (ruleIds: number[]) => { + await (chrome || browser).declarativeNetRequest.updateDynamicRules({ + removeRuleIds: ruleIds, + }); + if ((chrome || browser).runtime.lastError?.message) throw new Error((chrome || browser).runtime.lastError.message); +};