@@ -15,9 +15,7 @@ use crate::filters::abstract_network::{
1515use crate :: lists:: ParseOptions ;
1616use crate :: regex_manager:: RegexManager ;
1717use crate :: request;
18- use crate :: utils:: { self , Hash } ;
19-
20- pub ( crate ) const TOKENS_BUFFER_SIZE : usize = 200 ;
18+ use crate :: utils:: { self , Hash , TokensBuffer } ;
2119
2220/// For now, only support `$removeparam` with simple alphanumeric/dash/underscore patterns.
2321static VALID_PARAM : Lazy < Regex > = Lazy :: new ( || Regex :: new ( r"^[a-zA-Z0-9_\-]+$" ) . unwrap ( ) ) ;
@@ -312,10 +310,10 @@ pub enum FilterPart {
312310}
313311
314312#[ derive( Debug , PartialEq ) ]
315- pub enum FilterTokens {
313+ pub ( crate ) enum FilterTokens < ' a > {
316314 Empty ,
317- OptDomains ( Vec < Hash > ) ,
318- Other ( Vec < Hash > ) ,
315+ OptDomains ( & ' a [ Hash ] ) ,
316+ Other ( & ' a [ Hash ] ) ,
319317}
320318
321319pub struct FilterPartIterator < ' a > {
@@ -883,19 +881,11 @@ impl NetworkFilter {
883881 )
884882 }
885883
886- #[ deprecated( since = "0.11.1" , note = "use get_tokens_optimized instead" ) ]
887- pub fn get_tokens ( & self ) -> Vec < Vec < Hash > > {
888- match self . get_tokens_optimized ( ) {
889- FilterTokens :: OptDomains ( domains) => {
890- domains. into_iter ( ) . map ( |domain| vec ! [ domain] ) . collect ( )
891- }
892- FilterTokens :: Other ( tokens) => vec ! [ tokens] ,
893- FilterTokens :: Empty => vec ! [ ] ,
894- }
895- }
896-
897- pub fn get_tokens_optimized ( & self ) -> FilterTokens {
898- let mut tokens: Vec < Hash > = Vec :: with_capacity ( TOKENS_BUFFER_SIZE ) ;
884+ pub ( crate ) fn get_tokens < ' a > (
885+ & ' a self ,
886+ tokens_buffer : & ' a mut TokensBuffer ,
887+ ) -> FilterTokens < ' a > {
888+ tokens_buffer. clear ( ) ;
899889
900890 // If there is only one domain and no domain negation, we also use this
901891 // domain as a token.
@@ -905,7 +895,7 @@ impl NetworkFilter {
905895 {
906896 if let Some ( domains) = self . opt_domains . as_ref ( ) {
907897 if let Some ( domain) = domains. first ( ) {
908- tokens . push ( * domain)
898+ tokens_buffer . push ( * domain) ;
909899 }
910900 }
911901 }
@@ -918,7 +908,7 @@ impl NetworkFilter {
918908 ( self . is_plain ( ) || self . is_regex ( ) ) && !self . is_right_anchor ( ) ;
919909 let skip_first_token = self . is_right_anchor ( ) ;
920910
921- utils:: tokenize_filter_to ( f, skip_first_token, skip_last_token, & mut tokens ) ;
911+ utils:: tokenize_filter_to ( f, skip_first_token, skip_last_token, tokens_buffer ) ;
922912 }
923913 }
924914 FilterPart :: AnyOf ( _) => ( ) , // across AnyOf set of filters no single token is guaranteed to match to a request
@@ -928,45 +918,55 @@ impl NetworkFilter {
928918 // Append tokens from hostname, if any
929919 if !self . mask . contains ( NetworkFilterMask :: IS_HOSTNAME_REGEX ) {
930920 if let Some ( hostname) = self . hostname . as_ref ( ) {
931- utils:: tokenize_to ( hostname, & mut tokens ) ;
921+ utils:: tokenize_to ( hostname, tokens_buffer ) ;
932922 }
933923 } else if let Some ( hostname) = self . hostname . as_ref ( ) {
934924 // Find last dot to tokenize the prefix
935925 let last_dot_pos = hostname. rfind ( '.' ) ;
936926 if let Some ( last_dot_pos) = last_dot_pos {
937- utils:: tokenize_to ( & hostname[ ..last_dot_pos] , & mut tokens ) ;
927+ utils:: tokenize_to ( & hostname[ ..last_dot_pos] , tokens_buffer ) ;
938928 }
939929 }
940930
941- if tokens . is_empty ( ) && self . mask . contains ( NetworkFilterMask :: IS_REMOVEPARAM ) {
931+ if tokens_buffer . is_empty ( ) && self . mask . contains ( NetworkFilterMask :: IS_REMOVEPARAM ) {
942932 if let Some ( removeparam) = & self . modifier_option {
943933 if VALID_PARAM . is_match ( removeparam) {
944- utils:: tokenize_to ( & removeparam. to_ascii_lowercase ( ) , & mut tokens ) ;
934+ utils:: tokenize_to ( & removeparam. to_ascii_lowercase ( ) , tokens_buffer ) ;
945935 }
946936 }
947937 }
948938
949939 // If we got no tokens for the filter/hostname part, then we will dispatch
950940 // this filter in multiple buckets based on the domains option.
951- if tokens. is_empty ( ) && self . opt_domains . is_some ( ) && self . opt_not_domains . is_none ( ) {
941+ if tokens_buffer. is_empty ( ) && self . opt_domains . is_some ( ) && self . opt_not_domains . is_none ( )
942+ {
952943 if let Some ( opt_domains) = self . opt_domains . as_ref ( ) {
953944 if !opt_domains. is_empty ( ) {
954- return FilterTokens :: OptDomains ( opt_domains. clone ( ) ) ;
945+ return FilterTokens :: OptDomains ( opt_domains) ;
955946 }
956947 }
957948 FilterTokens :: Empty
958949 } else {
959950 // Add optional token for protocol
960951 if self . for_http ( ) && !self . for_https ( ) {
961- tokens . push ( utils:: fast_hash ( "http" ) ) ;
952+ tokens_buffer . push ( utils:: fast_hash ( "http" ) ) ;
962953 } else if self . for_https ( ) && !self . for_http ( ) {
963- tokens . push ( utils:: fast_hash ( "https" ) ) ;
954+ tokens_buffer . push ( utils:: fast_hash ( "https" ) ) ;
964955 }
965956
966- // Remake a vector to drop extra capacity.
967- let mut t = Vec :: with_capacity ( tokens. len ( ) ) ;
968- t. extend ( tokens) ;
969- FilterTokens :: Other ( t)
957+ FilterTokens :: Other ( tokens_buffer. as_slice ( ) )
958+ }
959+ }
960+
961+ #[ cfg( test) ]
962+ pub ( crate ) fn matches_test ( & self , request : & request:: Request ) -> bool {
963+ let filter_set = crate :: FilterSet :: new_with_rules ( vec ! [ self . clone( ) ] , vec ! [ ] , true ) ;
964+ let engine = crate :: Engine :: from_filter_set ( filter_set, true ) ;
965+
966+ if self . is_exception ( ) {
967+ engine. check_network_request_exceptions ( request)
968+ } else {
969+ engine. check_network_request ( request) . matched
970970 }
971971 }
972972}
@@ -986,35 +986,8 @@ impl fmt::Display for NetworkFilter {
986986 }
987987}
988988
989- pub trait NetworkMatchable {
989+ pub ( crate ) trait NetworkMatchable {
990990 fn matches ( & self , request : & request:: Request , regex_manager : & mut RegexManager ) -> bool ;
991-
992- #[ cfg( test) ]
993- fn matches_test ( & self , request : & request:: Request ) -> bool ;
994- }
995-
996- impl NetworkMatchable for NetworkFilter {
997- fn matches ( & self , request : & request:: Request , regex_manager : & mut RegexManager ) -> bool {
998- use crate :: filters:: network_matchers:: {
999- check_excluded_domains, check_included_domains, check_options, check_pattern,
1000- } ;
1001- check_options ( self . mask , request)
1002- && check_included_domains ( self . opt_domains . as_deref ( ) , request)
1003- && check_excluded_domains ( self . opt_not_domains . as_deref ( ) , request)
1004- && check_pattern (
1005- self . mask ,
1006- self . filter . iter ( ) ,
1007- self . hostname . as_deref ( ) ,
1008- ( self as * const NetworkFilter ) as u64 ,
1009- request,
1010- regex_manager,
1011- )
1012- }
1013-
1014- #[ cfg( test) ]
1015- fn matches_test ( & self , request : & request:: Request ) -> bool {
1016- self . matches ( request, & mut RegexManager :: default ( ) )
1017- }
1018991}
1019992
1020993// ---------------------------------------------------------------------------
0 commit comments