@@ -252,6 +252,14 @@ pub struct Rewrite {
252252 pub exclude_domains : Vec < String > ,
253253}
254254
255+ #[ derive( Debug , Default , Deserialize , Serialize , Validate ) ]
256+ pub struct ScriptOverrides {
257+ /// List of URL paths that should return empty JavaScript responses.
258+ /// Supports exact path matching only.
259+ #[ serde( default ) ]
260+ pub paths : Vec < String > ,
261+ }
262+
255263impl Rewrite {
256264 /// Checks if a URL should be excluded from rewriting based on domain matching
257265 #[ allow( dead_code) ]
@@ -279,6 +287,14 @@ impl Rewrite {
279287 }
280288}
281289
290+ impl ScriptOverrides {
291+ /// Checks if a path should be overridden with an empty script
292+ #[ allow( dead_code) ]
293+ pub fn is_overridden ( & self , path : & str ) -> bool {
294+ self . paths . iter ( ) . any ( |p| p == path)
295+ }
296+ }
297+
282298#[ derive( Debug , Default , Deserialize , Serialize , Validate ) ]
283299pub struct Handler {
284300 #[ validate( length( min = 1 ) , custom( function = validate_path) ) ]
@@ -336,6 +352,9 @@ pub struct Settings {
336352 #[ serde( default ) ]
337353 #[ validate( nested) ]
338354 pub rewrite : Rewrite ,
355+ #[ serde( default ) ]
356+ #[ validate( nested) ]
357+ pub script_overrides : ScriptOverrides ,
339358}
340359
341360#[ allow( unused) ]
@@ -957,4 +976,83 @@ mod tests {
957976 assert ! ( !rewrite. is_excluded( "not a url" ) ) ;
958977 assert ! ( !rewrite. is_excluded( "" ) ) ;
959978 }
979+
980+ #[ test]
981+ fn test_script_overrides_is_overridden ( ) {
982+ let overrides = ScriptOverrides {
983+ paths : vec ! [
984+ "/.static/prebid/1.0.8/prebid.min.js" . to_string( ) ,
985+ "/js/analytics.js" . to_string( ) ,
986+ ] ,
987+ } ;
988+
989+ // Should match exact paths
990+ assert ! ( overrides. is_overridden( "/.static/prebid/1.0.8/prebid.min.js" ) ) ;
991+ assert ! ( overrides. is_overridden( "/js/analytics.js" ) ) ;
992+
993+ // Should not match similar but different paths
994+ assert ! ( !overrides. is_overridden( "/.static/prebid/1.0.9/prebid.min.js" ) ) ;
995+ assert ! ( !overrides. is_overridden( "/js/analytics.min.js" ) ) ;
996+ assert ! ( !overrides. is_overridden( "/other/path.js" ) ) ;
997+ assert ! ( !overrides. is_overridden( "" ) ) ;
998+ }
999+
1000+ #[ test]
1001+ fn test_script_overrides_empty ( ) {
1002+ let overrides = ScriptOverrides { paths : vec ! [ ] } ;
1003+
1004+ assert ! ( !overrides. is_overridden( "/.static/prebid/1.0.8/prebid.min.js" ) ) ;
1005+ assert ! ( !overrides. is_overridden( "/js/analytics.js" ) ) ;
1006+ }
1007+
1008+ #[ test]
1009+ fn test_script_overrides_from_toml ( ) {
1010+ let toml_str = r#"
1011+ [publisher]
1012+ domain = "test-publisher.com"
1013+ cookie_domain = ".test-publisher.com"
1014+ origin_url = "https://origin.test-publisher.com"
1015+ proxy_secret = "test-secret"
1016+
1017+ [prebid]
1018+ server_url = "https://test-prebid.com/openrtb2/auction"
1019+
1020+ [synthetic]
1021+ counter_store = "test-counter-store"
1022+ opid_store = "test-opid-store"
1023+ secret_key = "test-secret-key"
1024+ template = "{{client_ip}}:{{user_agent}}"
1025+
1026+ [script_overrides]
1027+ paths = [
1028+ "/.static/prebid/1.0.8/prebid.min.js",
1029+ "/js/old-analytics.js"
1030+ ]
1031+ "# ;
1032+
1033+ let settings = Settings :: from_toml ( toml_str) . expect ( "should parse TOML" ) ;
1034+
1035+ assert_eq ! ( settings. script_overrides. paths. len( ) , 2 ) ;
1036+ assert ! ( settings
1037+ . script_overrides
1038+ . is_overridden( "/.static/prebid/1.0.8/prebid.min.js" ) ) ;
1039+ assert ! ( settings
1040+ . script_overrides
1041+ . is_overridden( "/js/old-analytics.js" ) ) ;
1042+ assert ! ( !settings
1043+ . script_overrides
1044+ . is_overridden( "/js/other-script.js" ) ) ;
1045+ }
1046+
1047+ #[ test]
1048+ fn test_script_overrides_default_empty ( ) {
1049+ let toml_str = crate_test_settings_str ( ) ;
1050+ let settings = Settings :: from_toml ( & toml_str) . expect ( "should parse TOML" ) ;
1051+
1052+ // When not specified, script_overrides should default to empty
1053+ assert_eq ! ( settings. script_overrides. paths. len( ) , 0 ) ;
1054+ assert ! ( !settings
1055+ . script_overrides
1056+ . is_overridden( "/.static/prebid/1.0.8/prebid.min.js" ) ) ;
1057+ }
9601058}
0 commit comments