GM XHR header处理
Some checks failed
test / Run tests (push) Failing after 11s
build / Build (push) Failing after 23s

This commit is contained in:
王一之 2025-03-11 17:50:46 +08:00
parent 6d983ed0e4
commit 99e33c18f6
3 changed files with 46 additions and 26 deletions

View File

@ -7,6 +7,12 @@ export class GMApi {
console.log(params); console.log(params);
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
xhr.open(params.method || "GET", params.url); xhr.open(params.method || "GET", params.url);
// 添加header
if (params.headers) {
for (const key in params.headers) {
xhr.setRequestHeader(key, params.headers[key]);
}
}
xhr.onload = function () { xhr.onload = function () {
console.log(xhr, xhr.getAllResponseHeaders()); console.log(xhr, xhr.getAllResponseHeaders());
}; };

View File

@ -5,9 +5,10 @@ import { Group, MessageConnect, MessageSender } from "@Packages/message/server";
import { ValueService } from "@App/app/service/service_worker/value"; import { ValueService } from "@App/app/service/service_worker/value";
import PermissionVerify from "./permission_verify"; import PermissionVerify from "./permission_verify";
import { ServiceWorkerMessageSend } from "@Packages/message/window_message"; import { ServiceWorkerMessageSend } from "@Packages/message/window_message";
import { connect, sendMessage } from "@Packages/message/client"; import { connect } from "@Packages/message/client";
import Cache, { incr } from "@App/app/cache"; import Cache, { incr } from "@App/app/cache";
import { unsafeHeaders } from "@App/runtime/utils"; import { unsafeHeaders } from "@App/runtime/utils";
import EventEmitter from "eventemitter3";
// GMApi,处理脚本的GM API调用请求 // GMApi,处理脚本的GM API调用请求
@ -129,6 +130,8 @@ export default class GMApi {
return ruleId; return ruleId;
} }
gmXhrHeadersReceived: EventEmitter = new EventEmitter();
@PermissionVerify.API() @PermissionVerify.API()
async GM_xmlhttpRequest(request: Request, con: MessageConnect) { async GM_xmlhttpRequest(request: Request, con: MessageConnect) {
if (request.params.length === 0) { if (request.params.length === 0) {
@ -145,19 +148,28 @@ export default class GMApi {
} }
params.headers["X-Scriptcat-GM-XHR-Request-Id"] = requestId.toString(); params.headers["X-Scriptcat-GM-XHR-Request-Id"] = requestId.toString();
await this.buildDNRRule(requestId, request.params[0]); await this.buildDNRRule(requestId, request.params[0]);
// 等待response
this.gmXhrHeadersReceived.addListener("headersReceived:" + requestId, (details) => {
console.log("处理", details);
});
// 再发送到offscreen, 处理请求 // 再发送到offscreen, 处理请求
connect(this.sender, "gmApi/xmlHttpRequest", request.params[0]); connect(this.sender, "gmApi/xmlHttpRequest", request.params[0]);
} }
start() { start() {
this.group.on("gmApi", this.handlerRequest.bind(this)); this.group.on("gmApi", this.handlerRequest.bind(this));
chrome.webRequest.onBeforeSendHeaders.addListener(
// 处理收到的header
console.log("123");
chrome.webRequest.onSendHeaders.addListener(
(details) => { (details) => {
console.log("onSendHeaders", details); if (details.tabId === -1) {
// 判断是否存在X-Scriptcat-GM-XHR-Request-Id
// 讲请求id与chrome.webRequest的请求id关联
if (details.requestHeaders) {
const requestId = details.requestHeaders.find((header) => header.name === "X-Scriptcat-GM-XHR-Request-Id");
if (requestId) {
Cache.getInstance().set("gmXhrRequest:" + details.requestId, requestId.value);
}
}
}
}, },
{ {
urls: ["<all_urls>"], urls: ["<all_urls>"],
@ -165,27 +177,23 @@ export default class GMApi {
}, },
["requestHeaders", "extraHeaders"] ["requestHeaders", "extraHeaders"]
); );
chrome.webRequest.onBeforeSendHeaders.addListener(
(details) => {
console.log("onBeforeSendHeaders", details);
return {
requestHeaders: [
{
name: "X-Scriptcat-GM-XHR-Request-Id",
value: "123",
},
],
};
},
{
urls: ["<all_urls>"],
types: ["xmlhttprequest"],
},
["requestHeaders"]
);
chrome.webRequest.onHeadersReceived.addListener( chrome.webRequest.onHeadersReceived.addListener(
(details) => { (details) => {
console.log(details); if (details.tabId === -1) {
// 判断请求是否与gmXhrRequest关联
Cache.getInstance()
.get("gmXhrRequest:" + details.requestId)
.then((requestId) => {
if (requestId) {
this.gmXhrHeadersReceived.emit("headersReceived:" + requestId, details);
// 删除关联与DNR
Cache.getInstance().del("gmXhrRequest:" + details.requestId);
chrome.declarativeNetRequest.updateSessionRules({
removeRuleIds: [parseInt(requestId)],
});
}
});
}
}, },
{ {
urls: ["<all_urls>"], urls: ["<all_urls>"],

View File

@ -0,0 +1,6 @@
export function isExtensionRequest(details: chrome.webRequest.ResourceRequest & { originUrl?: string }): boolean {
return !!(
(details.initiator && chrome.runtime.getURL("").startsWith(details.initiator)) ||
(details.originUrl && details.originUrl.startsWith(chrome.runtime.getURL("")))
);
}