Skip to content

Commit bdeb87c

Browse files
committed
fix: rule format upgrade #321
1 parent 2f56765 commit bdeb87c

File tree

3 files changed

+88
-23
lines changed

3 files changed

+88
-23
lines changed

src/pages/background/core/rules.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
isMatchUrl,
1919
upgradeRuleFormat,
2020
} from '@/share/core/rule-utils';
21+
import SessionMessage from '@/share/core/session-message';
2122
import { getLocal } from '@/share/core/storage';
2223
import type {
2324
InitdRule,
@@ -30,6 +31,7 @@ import {
3031
getVirtualKey,
3132
isValidArray,
3233
sleep,
34+
t,
3335
} from '@/share/core/utils';
3436
import { getDatabase } from './db';
3537

@@ -63,7 +65,13 @@ function updateCache(type: TABLE_NAMES): Promise<void> {
6365
try {
6466
all.push(initRule(s));
6567
} catch (e) {
66-
console.error('Cannot init rule', s, e);
68+
console.error('Init rule failed', s, e);
69+
SessionMessage.add({
70+
type: 'warning',
71+
title: t('init_rule_failed'),
72+
content: `Rule: [${s.id}] ${s.name}\nError: ${(e as Error).message}`,
73+
more: `Rule: ${JSON.stringify(s)}`,
74+
});
6775
}
6876
cursor.continue();
6977
} else {

src/pages/background/request-handler/web-request-handler.ts

Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import logger from '@/share/core/logger';
66
import { prefs } from '@/share/core/prefs';
77
import type { InitdRule, RULE_ACTION_OBJ } from '@/share/core/types';
88
import {
9-
getGlobal,
109
IS_CHROME,
1110
IS_SUPPORT_STREAM_FILTER,
1211
isValidArray,
@@ -63,12 +62,11 @@ function createHeaderListener(type: string): any {
6362

6463
class WebRequestHandler {
6564
private disableAll = false;
66-
private excludeHe = true;
6765
private includeHeaders = false;
6866
private modifyBody = false;
6967
private savedRequestHeader = new Map();
7068
private deleteHeaderTimer: ReturnType<typeof setTimeout> | null = null;
71-
private deleteHeaderQueue = new Map();
69+
private deleteHeaderQueue = new Map<string, number>();
7270

7371
constructor() {
7472
this.handleBeforeRequest = this.handleBeforeRequest.bind(this);
@@ -123,6 +121,59 @@ class WebRequestHandler {
123121
browser.webRequest.onHeadersReceived.removeListener(this.handleReceived);
124122
}
125123

124+
// Current not work
125+
private checkHooks() {
126+
const { onBeforeRequest, onBeforeSendHeaders, onHeadersReceived } =
127+
browser.webRequest;
128+
129+
if (this.disableAll) {
130+
return;
131+
}
132+
133+
if (!onBeforeRequest.hasListener(this.handleBeforeRequest)) {
134+
const rules = getRules(TABLE_NAMES.request, {
135+
runner: 'web_request',
136+
});
137+
if (isValidArray(rules)) {
138+
onBeforeRequest.addListener(
139+
this.handleBeforeRequest,
140+
{ urls: ['<all_urls>'] },
141+
['blocking'],
142+
);
143+
}
144+
}
145+
146+
if (!onBeforeSendHeaders.hasListener(this.handleBeforeSend)) {
147+
const rules = getRules(TABLE_NAMES.sendHeader, {
148+
runner: 'web_request',
149+
});
150+
if (isValidArray(rules)) {
151+
onBeforeSendHeaders.addListener(
152+
this.handleBeforeSend,
153+
{ urls: ['<all_urls>'] },
154+
createHeaderListener('requestHeaders'),
155+
);
156+
}
157+
}
158+
159+
if (!onHeadersReceived.hasListener(this.handleReceived)) {
160+
const rules = getRules(TABLE_NAMES.receiveHeader, {
161+
runner: 'web_request',
162+
});
163+
// response also can modify headers
164+
const respRules = getRules(TABLE_NAMES.receiveBody, {
165+
runner: 'web_request',
166+
});
167+
if (isValidArray(rules) || isValidArray(respRules)) {
168+
onHeadersReceived.addListener(
169+
this.handleReceived,
170+
{ urls: ['<all_urls>'] },
171+
createHeaderListener('responseHeaders'),
172+
);
173+
}
174+
}
175+
}
176+
126177
private loadPrefs() {
127178
emitter.on(emitter.EVENT_PREFS_UPDATE, (key: string, val: any) => {
128179
switch (key) {
@@ -151,8 +202,10 @@ class WebRequestHandler {
151202
if (this.disableAll) {
152203
return false;
153204
}
154-
// 判断是否是HE自身
155-
if (this.excludeHe && e.url.indexOf(browser.runtime.getURL('')) === 0) {
205+
if (
206+
e.url.startsWith('chrome-extension://') ||
207+
e.url.startsWith('moz-extension://')
208+
) {
156209
return false;
157210
}
158211
return true;
@@ -446,23 +499,22 @@ class WebRequestHandler {
446499

447500
private autoDeleteSavedHeader(id?: string) {
448501
if (id) {
449-
this.deleteHeaderQueue.set(id, Date.now() / 100);
502+
this.deleteHeaderQueue.set(id, Date.now());
450503
}
451504
if (this.deleteHeaderTimer !== null) {
452505
return;
453506
}
454-
this.deleteHeaderTimer = getGlobal().setTimeout(() => {
507+
this.deleteHeaderTimer = setTimeout(() => {
455508
// clear timeout
456509
if (this.deleteHeaderTimer) {
457510
clearTimeout(this.deleteHeaderTimer);
458511
}
459512
this.deleteHeaderTimer = null;
460-
// check time
461-
const curTime = Date.now() / 100;
513+
const curTime = Date.now();
462514
// k: id, v: time
463515
const iter = this.deleteHeaderQueue.entries();
464516
for (const [k, v] of iter) {
465-
if (curTime - v >= 90) {
517+
if (curTime - v >= 9000) {
466518
this.savedRequestHeader.delete(k);
467519
this.deleteHeaderQueue.delete(k);
468520
}

src/share/core/rule-utils.ts

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,21 @@ export function initRule(
4949
initd._func = new Function('val', 'detail', initd.code) as any;
5050
}
5151
// Init regexp
52-
if (initd.condition?.regex) {
53-
initd._reg = new RegExp(initd.condition.regex, 'g');
54-
}
55-
if (initd.matchType === 'regexp' && initd.pattern) {
56-
initd._reg = new RegExp(initd.pattern, 'g');
57-
}
58-
if (initd.condition?.excludeRegex) {
59-
initd._exclude = new RegExp(initd.condition.excludeRegex);
60-
}
61-
if (typeof initd.exclude === 'string' && initd.exclude.length > 0) {
62-
initd._exclude = new RegExp(initd.exclude);
52+
if (rule.condition) {
53+
const { regex, excludeRegex } = rule.condition;
54+
if (regex) {
55+
initd._reg = new RegExp(regex, 'g');
56+
}
57+
if (excludeRegex) {
58+
initd._exclude = new RegExp(excludeRegex);
59+
}
60+
} else {
61+
if (initd.matchType === 'regexp' && initd.pattern) {
62+
initd._reg = new RegExp(initd.pattern, 'g');
63+
}
64+
if (typeof initd.exclude === 'string' && initd.exclude.length > 0) {
65+
initd._exclude = new RegExp(initd.exclude);
66+
}
6367
}
6468
}
6569
return initd;
@@ -168,11 +172,12 @@ export function upgradeRuleFormat(s: OldRule) {
168172
default:
169173
break;
170174
}
171-
delete s.pattern;
172175
}
173176

174177
delete s.matchType;
175178
delete s.action;
179+
delete s.pattern;
180+
delete s.exclude;
176181

177182
return s;
178183
}

0 commit comments

Comments
 (0)