@@ -29,7 +29,6 @@ const redirectURLs = [
2929// Redirect URL to be used in declarativeNetRequest rule
3030const redirectURL : string = 'https://connectivity-check.ubuntu.com/204'
3131// In-memory cache for request details
32- export const requestCache = new Map < string , RequestDetails > ( )
3332export const tabRelationships = new Map < number , number > ( ) // key: new tab ID, value: opener tab ID
3433
3534// Request methods for declarativeNetRequest rules
@@ -122,10 +121,6 @@ async function registerInterceptionListener(): Promise<void> {
122121 log . info ( 'removing onBeforeRequest listener for interception' )
123122 browser . webRequest . onBeforeRequest . removeListener ( onBeforeRequestListener )
124123 }
125- if ( browser . webRequest . onHeadersReceived . hasListener ( onRedirectHeadersReceivedListener ) ) {
126- log . info ( 'removing onRedirectHeadersReceived listener for interception' )
127- browser . webRequest . onHeadersReceived . removeListener ( onRedirectHeadersReceivedListener )
128- }
129124 if ( browser . tabs . onCreated . hasListener ( onTabCreatedListener ) ) {
130125 log . info ( 'removing onTabCreated listener for interception' )
131126 browser . tabs . onCreated . removeListener ( onTabCreatedListener )
@@ -146,14 +141,6 @@ async function registerInterceptionListener(): Promise<void> {
146141 const error = e instanceof Error ? e : new Error ( String ( e ) )
147142 log . error ( 'failed to register onBeforeRequest listener for interception:' , error )
148143 }
149- try {
150- log . info ( 'registering onRedirectHeadersReceived listener for interception' )
151- browser . webRequest . onHeadersReceived . addListener ( onRedirectHeadersReceivedListener , { urls : [ redirectURL ] } )
152- log . info ( 'registration of the onRedirectHeadersReceived listener for interception was successful' )
153- } catch ( e ) {
154- const error = e instanceof Error ? e : new Error ( String ( e ) )
155- log . error ( 'failed to register onRedirectHeadersReceived listener for interception:' , error )
156- }
157144 try {
158145 log . info ( 'registering onTabCreated listener for interception' )
159146 browser . tabs . onCreated . addListener ( onTabCreatedListener )
@@ -179,60 +166,26 @@ function onBeforeRequestListener(
179166 details : Browser . webRequest . OnBeforeRequestDetails
180167) : Browser . webRequest . BlockingResponse | undefined {
181168 isURLTracked ( details . url ) . then ( ( isTracked ) => {
182- if ( ! isTracked ) return
183- log . info ( `request ${ details . requestId } to ${ details . url } is tracked, caching request details` )
169+ // If the tabId is negative, it means the request comes from the background script itself and hence should be ignored
170+ if ( ! isTracked || details . tabId < 0 ) return
171+ log . info ( `request ${ details . requestId } to ${ details . url } is going to be blocked, gathering request details` )
184172 let bodyData : RequestDetails [ 'body' ]
185173 if ( details . method !== 'GET' && details . requestBody ) {
186174 if ( details . requestBody . formData ) {
187175 bodyData = details . requestBody . formData as RequestDetails [ 'body' ]
188176 }
189177 }
190- requestCache . set ( details . requestId , {
178+ const requestDeatils = {
191179 tabId : details . tabId ,
192180 requestId : details . requestId ,
193181 url : details . url ,
194182 method : details . method ,
195183 body : bodyData ,
196184 // @ts -expect-error: Property 'originUrl' does not exist on type 'WebRequestBodyDetails'
197185 source : details . originUrl ?? details . initiator ?? '' ,
198- } )
199- setTimeout ( ( ) => {
200- if ( requestCache . delete ( details . requestId ) ) {
201- log . info ( `request cache for request ${ details . requestId } was cleared after 5 seconds` )
202- }
203- } , 5000 )
204- } )
205- return undefined
206- }
207-
208- function onRedirectHeadersReceivedListener (
209- details : Browser . webRequest . OnHeadersReceivedDetails
210- ) : Browser . webRequest . BlockingResponse | undefined {
211- ; ( async ( ) => {
212- log . info ( `interception redirect detected for request ${ details . requestId } ` )
213- // Wait for the request details to be available in the cache.
214- // This is necessary because onBeforeRedirectRequestListener may be called
215- // before onBeforeRequestListener has finished caching the details.
216- let timeout = false
217- setTimeout ( ( ) => {
218- timeout = true
219- } , 1000 )
220- while ( ! requestCache . has ( details . requestId ) ) {
221- log . info ( `waiting for cached request details of request ${ details . requestId } ` )
222- await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) )
223- if ( timeout ) {
224- log . warn ( `waiting for request details of request ${ details . requestId } timed out, skipping interception` )
225- return
226- }
227186 }
228- // Once the request details are available or the timeout is reached,
229- // either process the request if found in cache or ignore it
230- if ( requestCache . has ( details . requestId ) ) {
231- log . info ( `request details of intercepted request ${ details . requestId } found in cache` )
232- interceptRequest ( requestCache . get ( details . requestId ) ! )
233- requestCache . delete ( details . requestId )
234- }
235- } ) ( )
187+ interceptRequest ( requestDeatils )
188+ } )
236189 return undefined
237190}
238191
@@ -249,7 +202,7 @@ function constructRuleSet(activeDomains: DomainSettings[]): Browser.declarativeN
249202 priority : 1 ,
250203 action : { type : 'redirect' , redirect : { url : redirectURL } } ,
251204 condition : {
252- regexFilter : ` ${ domain . domain } ${ normalizeRegexStart ( domain . pathRegExp ) } ` ,
205+ regexFilter : getDomainRegExp ( domain ) ,
253206 resourceTypes,
254207 requestMethods,
255208 initiatorDomains : [ domain . domain ] ,
@@ -284,10 +237,11 @@ async function createUrlsFilter(): Promise<string[]> {
284237}
285238
286239async function isURLTracked ( url : string ) : Promise < boolean > {
240+ if ( url . includes ( 'x-nzbdonkey' ) ) return false // avoid intercepting our own requests from the content script
287241 const activeDomains = await getActiveDomains ( )
288242 for ( const domain of activeDomains ) {
289243 try {
290- const regex = new RegExp ( ` ${ domain . domain } ${ normalizeRegexStart ( domain . pathRegExp ) } ` , 'i' )
244+ const regex = new RegExp ( getDomainRegExp ( domain ) , 'i' )
291245 if ( regex . test ( url ) ) return true
292246 } catch ( e ) {
293247 const error = e instanceof Error ? e : new Error ( String ( e ) )
@@ -297,6 +251,7 @@ async function isURLTracked(url: string): Promise<boolean> {
297251 return false
298252}
299253
300- function normalizeRegexStart ( input : string ) : string {
301- return input . startsWith ( '^' ) ? input . slice ( 1 ) : '.*?' + input
254+ function getDomainRegExp ( domain : DomainSettings ) : string {
255+ const pathRegExp = domain . pathRegExp . startsWith ( '^' ) ? domain . pathRegExp . slice ( 1 ) : '.*?' + domain . pathRegExp
256+ return `${ domain . domain } ${ pathRegExp } `
302257}
0 commit comments