Fix broken http header filtering

Related issue:
- https://github.com/uBlockOrigin/uBlock-issues/issues/2552
This commit is contained in:
Raymond Hill 2023-03-21 10:22:32 -04:00
parent 285ce54d9c
commit 72cc9a8fe8
No known key found for this signature in database
GPG key ID: 25E1490B761470C2

View file

@ -41,12 +41,10 @@ const $exceptions = new Set();
let acceptedCount = 0; let acceptedCount = 0;
let discardedCount = 0; let discardedCount = 0;
const headerIndexFromName = function(name, headers) { const headerIndexFromName = function(name, headers, start = 0) {
let i = headers.length; for ( let i = start; i < headers.length; i++ ) {
while ( i-- ) { if ( headers[i].name.toLowerCase() !== name ) { continue; }
if ( headers[i].name.toLowerCase() === name ) { return i;
return i;
}
} }
return -1; return -1;
}; };
@ -138,7 +136,7 @@ httpheaderFilteringEngine.fromCompiledContent = function(reader) {
duplicates.add(fingerprint); duplicates.add(fingerprint);
const args = reader.args(); const args = reader.args();
if ( args.length < 4 ) { continue; } if ( args.length < 4 ) { continue; }
filterDB.store(args[1], args[2], args[3].slice(15, -1)); filterDB.store(args[1], args[2], args[3]);
} }
}; };
@ -175,18 +173,20 @@ httpheaderFilteringEngine.apply = function(fctxt, headers) {
const hasGlobalException = $exceptions.has(''); const hasGlobalException = $exceptions.has('');
let modified = false; let modified = false;
let i = 0;
for ( const name of $headers ) { for ( const name of $headers ) {
for (;;) { const isExcepted = hasGlobalException || $exceptions.has(name);
const i = headerIndexFromName(name, headers); if ( isExcepted ) {
if ( i === -1 ) { break; } if ( logger.enabled ) {
const isExcepted = hasGlobalException || $exceptions.has(name); logOne(true, hasGlobalException ? '' : name, fctxt);
if ( isExcepted ) {
if ( logger.enabled ) {
logOne(true, hasGlobalException ? '' : name, fctxt);
}
break;
} }
continue;
}
i = 0;
for (;;) {
i = headerIndexFromName(name, headers, i);
if ( i === -1 ) { break; }
headers.splice(i, 1); headers.splice(i, 1);
if ( logger.enabled ) { if ( logger.enabled ) {
logOne(false, name, fctxt); logOne(false, name, fctxt);