@@ -3,7 +3,7 @@ use std::path::Path;
33
44use crate :: datadog_static_analyzer_server:: fairings:: TraceSpan ;
55use crate :: datadog_static_analyzer_server:: rule_cache:: cached_analysis_request;
6- use crate :: { RAYON_POOL , RULE_CACHE , V8_PLATFORM } ;
6+ use crate :: { RAYON_POOL , RULE_CACHE , SECRET_SCANNER_CACHE , V8_PLATFORM } ;
77use kernel:: analysis:: ddsa_lib:: JsRuntime ;
88use rocket:: {
99 fs:: NamedFile ,
@@ -153,7 +153,10 @@ async fn analyze(
153153 . unwrap ( )
154154}
155155
156- fn process_secret_scan_request ( request : SecretScanRequest ) -> Result < Vec < SecretResult > , String > {
156+ fn process_secret_scan_request (
157+ request : SecretScanRequest ,
158+ cache : Option < & super :: secret_scanner_cache:: SecretScannerCache > ,
159+ ) -> Result < Vec < SecretResult > , String > {
157160 // Maximum number of rules per request to prevent excessive CPU usage.
158161 const MAX_RULES_COUNT : usize = 1000 ;
159162
@@ -174,16 +177,20 @@ fn process_secret_scan_request(request: SecretScanRequest) -> Result<Vec<SecretR
174177 return Err ( "Invalid filename: path traversal detected" . to_string ( ) ) ;
175178 }
176179
177- // Deserialize rules from JSON
178- let rules: Vec < secrets:: model:: secret_rule:: SecretRule > = request
179- . rules
180- . iter ( )
181- . map ( |r| serde_json:: from_value ( r. clone ( ) ) )
182- . collect :: < Result < Vec < _ > , _ > > ( )
183- . map_err ( |e| format ! ( "Failed to parse rules: {}" , e) ) ?;
184-
185- // Build the scanner with the provided rules
186- let scanner = secrets:: scanner:: build_sds_scanner ( & rules, request. use_debug ) ?;
180+ // Get scanner + parsed rules (from cache or fresh build)
181+ let ( scanner, rules) = if let Some ( cache) = cache {
182+ cache. get_or_build ( & request. rules , request. use_debug ) ?
183+ } else {
184+ // No cache - build from scratch
185+ let rules: Vec < secrets:: model:: secret_rule:: SecretRule > = request
186+ . rules
187+ . iter ( )
188+ . map ( |r| serde_json:: from_str ( r. get ( ) ) )
189+ . collect :: < Result < Vec < _ > , _ > > ( )
190+ . map_err ( |e| format ! ( "Failed to parse rules: {}" , e) ) ?;
191+ let scanner = secrets:: scanner:: build_sds_scanner ( & rules, request. use_debug ) ?;
192+ ( std:: sync:: Arc :: new ( scanner) , std:: sync:: Arc :: new ( rules) )
193+ } ;
187194
188195 // Configure analysis options
189196 let options = common:: analysis_options:: AnalysisOptions {
@@ -210,10 +217,11 @@ async fn scan_secrets(span: TraceSpan, request: Json<SecretScanRequest>) -> Valu
210217
211218 rocket:: tokio:: task:: spawn_blocking ( move || {
212219 let request = request. into_inner ( ) ;
213- let ( rule_responses, errors) = match process_secret_scan_request ( request) {
214- Ok ( resp) => ( resp, vec ! [ ] ) ,
215- Err ( err) => ( vec ! [ ] , vec ! [ err] ) ,
216- } ;
220+ let ( rule_responses, errors) =
221+ match process_secret_scan_request ( request, SECRET_SCANNER_CACHE . get ( ) ) {
222+ Ok ( resp) => ( resp, vec ! [ ] ) ,
223+ Err ( err) => ( vec ! [ ] , vec ! [ err] ) ,
224+ } ;
217225
218226 json ! ( SecretScanResponse {
219227 rule_responses,
0 commit comments