@@ -304,7 +304,7 @@ impl CachedClient {
304304 . await ?
305305 } else {
306306 debug ! ( "No cache entry for: {}" , req. url( ) ) ;
307- let ( response, cache_policy) = self . fresh_request ( req) . await ?;
307+ let ( response, cache_policy) = self . fresh_request ( req, cache_control ) . await ?;
308308 CachedResponse :: ModifiedOrNew {
309309 response,
310310 cache_policy,
@@ -318,8 +318,13 @@ impl CachedClient {
318318 "Broken fresh cache entry (for payload) at {}, removing: {err}" ,
319319 cache_entry. path( ) . display( )
320320 ) ;
321- self . resend_and_heal_cache ( fresh_req, cache_entry, response_callback)
322- . await
321+ self . resend_and_heal_cache (
322+ fresh_req,
323+ cache_entry,
324+ cache_control,
325+ response_callback,
326+ )
327+ . await
323328 }
324329 } ,
325330 CachedResponse :: NotModified { cached, new_policy } => {
@@ -339,8 +344,13 @@ impl CachedClient {
339344 (for payload) at {}, removing: {err}",
340345 cache_entry. path( ) . display( )
341346 ) ;
342- self . resend_and_heal_cache ( fresh_req, cache_entry, response_callback)
343- . await
347+ self . resend_and_heal_cache (
348+ fresh_req,
349+ cache_entry,
350+ cache_control,
351+ response_callback,
352+ )
353+ . await
344354 }
345355 }
346356 }
@@ -355,8 +365,13 @@ impl CachedClient {
355365 // ETag didn't match). We need to make a fresh request.
356366 if response. status ( ) == http:: StatusCode :: NOT_MODIFIED {
357367 warn ! ( "Server returned unusable 304 for: {}" , fresh_req. url( ) ) ;
358- self . resend_and_heal_cache ( fresh_req, cache_entry, response_callback)
359- . await
368+ self . resend_and_heal_cache (
369+ fresh_req,
370+ cache_entry,
371+ cache_control,
372+ response_callback,
373+ )
374+ . await
360375 } else {
361376 self . run_response_callback (
362377 cache_entry,
@@ -379,9 +394,10 @@ impl CachedClient {
379394 & self ,
380395 req : Request ,
381396 cache_entry : & CacheEntry ,
397+ cache_control : CacheControl < ' _ > ,
382398 response_callback : Callback ,
383399 ) -> Result < Payload , CachedClientError < CallBackError > > {
384- let ( response, cache_policy) = self . fresh_request ( req) . await ?;
400+ let ( response, cache_policy) = self . fresh_request ( req, cache_control ) . await ?;
385401
386402 let payload = self
387403 . run_response_callback ( cache_entry, cache_policy, response, async |resp| {
@@ -401,10 +417,11 @@ impl CachedClient {
401417 & self ,
402418 req : Request ,
403419 cache_entry : & CacheEntry ,
420+ cache_control : CacheControl < ' _ > ,
404421 response_callback : Callback ,
405422 ) -> Result < Payload :: Target , CachedClientError < CallBackError > > {
406423 let _ = fs_err:: tokio:: remove_file ( & cache_entry. path ( ) ) . await ;
407- let ( response, cache_policy) = self . fresh_request ( req) . await ?;
424+ let ( response, cache_policy) = self . fresh_request ( req, cache_control ) . await ?;
408425 self . run_response_callback ( cache_entry, cache_policy, response, response_callback)
409426 . await
410427 }
@@ -476,20 +493,13 @@ impl CachedClient {
476493 ) -> Result < CachedResponse , Error > {
477494 // Apply the cache control header, if necessary.
478495 match cache_control {
479- CacheControl :: None | CacheControl :: AllowStale => { }
496+ CacheControl :: None | CacheControl :: AllowStale | CacheControl :: Override ( .. ) => { }
480497 CacheControl :: MustRevalidate => {
481498 req. headers_mut ( ) . insert (
482499 http:: header:: CACHE_CONTROL ,
483500 http:: HeaderValue :: from_static ( "no-cache" ) ,
484501 ) ;
485502 }
486- CacheControl :: Override ( value) => {
487- req. headers_mut ( ) . insert (
488- http:: header:: CACHE_CONTROL ,
489- http:: HeaderValue :: from_str ( value)
490- . map_err ( |_| ErrorKind :: InvalidCacheControl ( value. to_string ( ) ) ) ?,
491- ) ;
492- }
493503 }
494504 Ok ( match cached. cache_policy . before_request ( & mut req) {
495505 BeforeRequest :: Fresh => {
@@ -499,8 +509,13 @@ impl CachedClient {
499509 BeforeRequest :: Stale ( new_cache_policy_builder) => match cache_control {
500510 CacheControl :: None | CacheControl :: MustRevalidate | CacheControl :: Override ( _) => {
501511 debug ! ( "Found stale response for: {}" , req. url( ) ) ;
502- self . send_cached_handle_stale ( req, cached, new_cache_policy_builder)
503- . await ?
512+ self . send_cached_handle_stale (
513+ req,
514+ cache_control,
515+ cached,
516+ new_cache_policy_builder,
517+ )
518+ . await ?
504519 }
505520 CacheControl :: AllowStale => {
506521 debug ! ( "Found stale (but allowed) response for: {}" , req. url( ) ) ;
@@ -513,7 +528,7 @@ impl CachedClient {
513528 "Cached request doesn't match current request for: {}" ,
514529 req. url( )
515530 ) ;
516- let ( response, cache_policy) = self . fresh_request ( req) . await ?;
531+ let ( response, cache_policy) = self . fresh_request ( req, cache_control ) . await ?;
517532 CachedResponse :: ModifiedOrNew {
518533 response,
519534 cache_policy,
@@ -525,19 +540,30 @@ impl CachedClient {
525540 async fn send_cached_handle_stale (
526541 & self ,
527542 req : Request ,
543+ cache_control : CacheControl < ' _ > ,
528544 cached : DataWithCachePolicy ,
529545 new_cache_policy_builder : CachePolicyBuilder ,
530546 ) -> Result < CachedResponse , Error > {
531547 let url = DisplaySafeUrl :: from ( req. url ( ) . clone ( ) ) ;
532548 debug ! ( "Sending revalidation request for: {url}" ) ;
533- let response = self
549+ let mut response = self
534550 . 0
535551 . execute ( req)
536552 . instrument ( info_span ! ( "revalidation_request" , url = url. as_str( ) ) )
537553 . await
538554 . map_err ( |err| ErrorKind :: from_reqwest_middleware ( url. clone ( ) , err) ) ?
539555 . error_for_status ( )
540556 . map_err ( |err| ErrorKind :: from_reqwest ( url. clone ( ) , err) ) ?;
557+
558+ // If the user set a custom `Cache-Control` header, override it.
559+ if let CacheControl :: Override ( header) = cache_control {
560+ response. headers_mut ( ) . insert (
561+ http:: header:: CACHE_CONTROL ,
562+ http:: HeaderValue :: from_str ( header)
563+ . expect ( "Cache-Control header must be valid UTF-8" ) ,
564+ ) ;
565+ }
566+
541567 match cached
542568 . cache_policy
543569 . after_response ( new_cache_policy_builder, & response)
@@ -566,16 +592,26 @@ impl CachedClient {
566592 async fn fresh_request (
567593 & self ,
568594 req : Request ,
595+ cache_control : CacheControl < ' _ > ,
569596 ) -> Result < ( Response , Option < Box < CachePolicy > > ) , Error > {
570597 let url = DisplaySafeUrl :: from ( req. url ( ) . clone ( ) ) ;
571598 trace ! ( "Sending fresh {} request for {}" , req. method( ) , url) ;
572599 let cache_policy_builder = CachePolicyBuilder :: new ( & req) ;
573- let response = self
600+ let mut response = self
574601 . 0
575602 . execute ( req)
576603 . await
577604 . map_err ( |err| ErrorKind :: from_reqwest_middleware ( url. clone ( ) , err) ) ?;
578605
606+ // If the user set a custom `Cache-Control` header, override it.
607+ if let CacheControl :: Override ( header) = cache_control {
608+ response. headers_mut ( ) . insert (
609+ http:: header:: CACHE_CONTROL ,
610+ http:: HeaderValue :: from_str ( header)
611+ . expect ( "Cache-Control header must be valid UTF-8" ) ,
612+ ) ;
613+ }
614+
579615 let retry_count = response
580616 . extensions ( )
581617 . get :: < reqwest_retry:: RetryCount > ( )
@@ -690,6 +726,7 @@ impl CachedClient {
690726 & self ,
691727 req : Request ,
692728 cache_entry : & CacheEntry ,
729+ cache_control : CacheControl < ' _ > ,
693730 response_callback : Callback ,
694731 ) -> Result < Payload , CachedClientError < CallBackError > > {
695732 let mut past_retries = 0 ;
@@ -698,7 +735,7 @@ impl CachedClient {
698735 loop {
699736 let fresh_req = req. try_clone ( ) . expect ( "HTTP request must be cloneable" ) ;
700737 let result = self
701- . skip_cache ( fresh_req, cache_entry, & response_callback)
738+ . skip_cache ( fresh_req, cache_entry, cache_control , & response_callback)
702739 . await ;
703740
704741 // Check if the middleware already performed retries
0 commit comments