@@ -19,10 +19,11 @@ use once_cell::sync::Lazy;
1919use sha2:: { Digest , Sha256 } ;
2020use std:: sync:: Arc ;
2121use tokio:: sync:: { Semaphore , mpsc} ;
22- use tokio:: time:: { Instant } ;
22+ use tokio:: time:: Instant ;
2323
2424use crate :: config:: { CONFIG , StorageBackend } ;
2525use crate :: memory:: memory;
26+ use crate :: rules:: bypass:: should_bypass_cache;
2627use crate :: rules:: latency:: { get_max_latency_for_path, mark_latency_fail, should_failover} ;
2728use crate :: rules:: refresh:: should_refresh;
2829use crate :: storage:: { azure, gcs, local, s3} ;
@@ -121,7 +122,9 @@ pub async fn proxy_handler(req: Request<Body>) -> impl IntoResponse {
121122 let key = hash_uri ( & key_source) ;
122123 tracing:: debug!( "🔑 Cache key generated: {}" , key) ;
123124
124- let force_refresh = should_refresh ( & key) ;
125+ //Refresh force by percetange hit rule
126+ let bypass_cache = should_bypass_cache ( req. headers ( ) ) ;
127+ let force_refresh = should_refresh ( & key) || bypass_cache;
125128
126129 // If the URI is in failover mode, serve from cache
127130 if should_failover ( & uri) && !force_refresh {
@@ -189,20 +192,25 @@ pub async fn proxy_handler(req: Request<Body>) -> impl IntoResponse {
189192 let exceeded_latency = elapsed_ms > threshold_ms;
190193 let fallback_active = should_failover ( & uri) ;
191194
192- if is_success && ( exceeded_latency || !fallback_active) {
193- memory:: load_into_memory ( vec ! [ ( key. clone( ) , cached_response) ] ) . await ;
194- let _ = CACHE_WRITER
195- . send ( ( key. clone ( ) , body_bytes. clone ( ) , headers_vec) )
196- . await ;
197- counter ! ( "cachebolt_memory_store_total" , "uri" => uri. clone( ) ) . increment ( 1 ) ;
195+ if !bypass_cache {
196+ if is_success && ( exceeded_latency || !fallback_active) {
197+ memory:: load_into_memory ( vec ! [ ( key. clone( ) , cached_response) ] ) . await ;
198+ let _ = CACHE_WRITER
199+ . send ( ( key. clone ( ) , body_bytes. clone ( ) , headers_vec) )
200+ . await ;
201+ counter ! ( "cachebolt_memory_store_total" , "uri" => uri. clone( ) )
202+ . increment ( 1 ) ;
203+ } else {
204+ tracing:: info!(
205+ "⚠️ Skipping cache store for '{}' (status: {}, exceeded_latency: {}, fallback_active: {})" ,
206+ uri,
207+ status,
208+ exceeded_latency,
209+ fallback_active
210+ ) ;
211+ }
198212 } else {
199- tracing:: info!(
200- "⚠️ Skipping cache store for '{}' (status: {}, exceeded_latency: {}, fallback_active: {})" ,
201- uri,
202- status,
203- exceeded_latency,
204- fallback_active
205- ) ;
213+ tracing:: info!( "⏩ Cache bypass activated for '{}' due to client header" , uri) ;
206214 }
207215
208216 Response :: from_parts ( parts, Body :: from ( body_bytes) )
0 commit comments