Skip to content

Commit c0da6a0

Browse files
committed
🐛 修复 GM XHR 重定向 unsafeHeader 处理问题 #444
1 parent d384f37 commit c0da6a0

1 file changed

Lines changed: 43 additions & 16 deletions

File tree

src/app/service/service_worker/gm_api.ts

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -442,15 +442,20 @@ export default class GMApi {
442442
}
443443
}
444444

445+
// 有一些操作需要同步,就用Map作为缓存
446+
cache = new Map<string, any>();
447+
445448
// 根据header生成dnr规则
446449
async buildDNRRule(
447450
reqeustId: number,
448451
params: GMSend.XHRDetails,
449452
sender: GetSender
450453
): Promise<{ [key: string]: string }> {
451-
// 默认移除origin
452454
const headers = params.headers || {};
453-
headers["origin"] = headers["origin"] || "";
455+
// 如果header中没有origin就设置为空字符串,如果有origin就不做处理,注意处理大小写
456+
if (!("Origin" in headers) && !("origin" in headers)) {
457+
headers["Origin"] = "";
458+
}
454459

455460
const requestHeaders = [
456461
{
@@ -544,9 +549,8 @@ export default class GMApi {
544549
deleteHeader && delete headers[key];
545550
});
546551

547-
const ruleId = reqeustId;
548552
const rule = {} as chrome.declarativeNetRequest.Rule;
549-
rule.id = ruleId;
553+
rule.id = reqeustId;
550554
rule.action = {
551555
type: "modifyHeaders" as chrome.declarativeNetRequest.RuleActionType,
552556
requestHeaders: requestHeaders,
@@ -565,8 +569,9 @@ export default class GMApi {
565569
requestMethods: [(params.method || "GET").toLowerCase() as chrome.declarativeNetRequest.RequestMethod],
566570
excludedTabIds: excludedTabIds,
567571
};
572+
this.cache.set("dnrRule:" + reqeustId.toString(), rule);
568573
await chrome.declarativeNetRequest.updateSessionRules({
569-
removeRuleIds: [ruleId],
574+
removeRuleIds: [reqeustId],
570575
addRules: [rule],
571576
});
572577
return headers;
@@ -1113,7 +1118,7 @@ export default class GMApi {
11131118
if (details.requestHeaders) {
11141119
const requestId = details.requestHeaders.find((header) => header.name === "X-Scriptcat-GM-XHR-Request-Id");
11151120
if (requestId) {
1116-
Cache.getInstance().set("gmXhrRequest:" + details.requestId, requestId.value);
1121+
this.cache.set("gmXhrRequest:" + details.requestId, requestId.value);
11171122
}
11181123
}
11191124
}
@@ -1129,18 +1134,40 @@ export default class GMApi {
11291134
(details) => {
11301135
if (details.tabId === -1) {
11311136
// 判断请求是否与gmXhrRequest关联
1132-
Cache.getInstance()
1133-
.get("gmXhrRequest:" + details.requestId)
1134-
.then((requestId) => {
1135-
if (requestId) {
1136-
this.gmXhrHeadersReceived.emit("headersReceived:" + requestId, details);
1137-
// 删除关联与DNR
1138-
Cache.getInstance().del("gmXhrRequest:" + details.requestId);
1139-
chrome.declarativeNetRequest.updateSessionRules({
1140-
removeRuleIds: [parseInt(requestId)],
1141-
});
1137+
const requestId = this.cache.get("gmXhrRequest:" + details.requestId);
1138+
if (requestId) {
1139+
// 判断是否重定向
1140+
let location = "";
1141+
details.responseHeaders?.forEach((header) => {
1142+
if (header.name.toLowerCase() === "location") {
1143+
// 重定向
1144+
location = header.value || "";
11421145
}
11431146
});
1147+
if (location) {
1148+
// 处理重定向后的unsafeHeader
1149+
const rule = this.cache.get("dnrRule:" + requestId) as chrome.declarativeNetRequest.Rule;
1150+
// 修改匹配链接
1151+
rule.condition.urlFilter = location;
1152+
// 不处理cookie
1153+
rule.action.requestHeaders = rule.action.requestHeaders?.filter(
1154+
(header) => header.header.toLowerCase() !== "cookie"
1155+
);
1156+
chrome.declarativeNetRequest.updateSessionRules({
1157+
removeRuleIds: [parseInt(requestId)],
1158+
addRules: [rule],
1159+
});
1160+
console.log("old rule", requestId, rule);
1161+
return;
1162+
}
1163+
this.gmXhrHeadersReceived.emit("headersReceived:" + requestId, details);
1164+
// 删除关联与DNR
1165+
this.cache.delete("gmXhrRequest:" + details.requestId);
1166+
this.cache.delete("dnrRule:" + requestId);
1167+
chrome.declarativeNetRequest.updateSessionRules({
1168+
removeRuleIds: [parseInt(requestId)],
1169+
});
1170+
}
11441171
}
11451172
return undefined;
11461173
},

0 commit comments

Comments
 (0)