2
2
//! the [`crate::Engine`], infrequently used regexes can be discarded. The [`RegexManager`] is
3
3
//! responsible for managing the storage of regexes used by filters.
4
4
5
- use crate :: filters:: network:: { NetworkFilter , NetworkFilterMaskHelper } ;
5
+ use crate :: filters:: network:: { NetworkFilterMask , NetworkFilterMaskHelper } ;
6
6
7
7
use regex:: {
8
8
bytes:: Regex as BytesRegex , bytes:: RegexBuilder as BytesRegexBuilder ,
@@ -148,12 +148,15 @@ impl Default for RegexManager {
148
148
}
149
149
}
150
150
151
- fn make_regexp ( filter : & NetworkFilter ) -> CompiledRegex {
151
+ fn make_regexp < ' a , FiltersIter > ( mask : NetworkFilterMask , filters : FiltersIter ) -> CompiledRegex
152
+ where
153
+ FiltersIter : Iterator < Item = & ' a str > + ExactSizeIterator ,
154
+ {
152
155
compile_regex (
153
- filter . filter . iter ( ) ,
154
- filter . is_right_anchor ( ) ,
155
- filter . is_left_anchor ( ) ,
156
- filter . is_complete_regex ( ) ,
156
+ filters ,
157
+ mask . is_right_anchor ( ) ,
158
+ mask . is_left_anchor ( ) ,
159
+ mask . is_complete_regex ( ) ,
157
160
)
158
161
}
159
162
@@ -236,11 +239,19 @@ where
236
239
impl RegexManager {
237
240
/// Check whether or not a regex network filter matches a certain URL pattern, using the
238
241
/// [`RegexManager`]'s managed regex storage.
239
- pub fn matches ( & mut self , filter : & NetworkFilter , pattern : & str ) -> bool {
240
- if !filter. is_regex ( ) && !filter. is_complete_regex ( ) {
242
+ pub fn matches < ' a , FiltersIter > (
243
+ & mut self ,
244
+ mask : NetworkFilterMask ,
245
+ filters : FiltersIter ,
246
+ key : u64 ,
247
+ pattern : & str ,
248
+ ) -> bool
249
+ where
250
+ FiltersIter : Iterator < Item = & ' a str > + ExactSizeIterator ,
251
+ {
252
+ if !mask. is_regex ( ) && !mask. is_complete_regex ( ) {
241
253
return true ;
242
254
}
243
- let key = ( filter as * const NetworkFilter ) as u64 ;
244
255
use std:: collections:: hash_map:: Entry ;
245
256
match self . map . entry ( key) {
246
257
Entry :: Occupied ( mut e) => {
@@ -249,15 +260,15 @@ impl RegexManager {
249
260
v. last_used = self . now ;
250
261
if v. regex . is_none ( ) {
251
262
// A discarded entry, recreate it:
252
- v. regex = Some ( make_regexp ( filter ) ) ;
263
+ v. regex = Some ( make_regexp ( mask , filters ) ) ;
253
264
self . compiled_regex_count += 1 ;
254
265
}
255
266
return v. regex . as_ref ( ) . unwrap ( ) . is_match ( pattern) ;
256
267
}
257
268
Entry :: Vacant ( e) => {
258
269
self . compiled_regex_count += 1 ;
259
270
let new_entry = RegexEntry {
260
- regex : Some ( make_regexp ( filter ) ) ,
271
+ regex : Some ( make_regexp ( mask , filters ) ) ,
261
272
last_used : self . now ,
262
273
usage_count : 1 ,
263
274
} ;
0 commit comments