@@ -225,6 +225,36 @@ module.exports = class CachePolicy {
225225 }
226226
227227 satisfiesWithoutRevalidation ( req ) {
228+ const result = this . evaluateRequest ( req )
229+ return ! result . revalidation ;
230+ }
231+
232+ _evaluateRequestHitResult ( stale = false , revalidation = undefined ) {
233+ return {
234+ response : {
235+ headers : this . responseHeaders ( ) ,
236+ stale,
237+ } ,
238+ revalidation,
239+ }
240+ }
241+
242+ _evaluateRequestRevalidation ( request , synchronous = true ) {
243+ return {
244+ synchronous,
245+ request : {
246+ headers : this . revalidationHeaders ( request ) ,
247+ } ,
248+ } ;
249+ }
250+
251+ _evaluateRequestMissResult ( request ) {
252+ return {
253+ revalidation : this . _evaluateRequestRevalidation ( request ) ,
254+ }
255+ }
256+
257+ evaluateRequest ( req ) {
228258 this . _assertRequestHasHeaders ( req ) ;
229259
230260 // In all circumstances, a cache MUST NOT ignore the must-revalidate directive
@@ -240,21 +270,24 @@ module.exports = class CachePolicy {
240270 // the presented request does not contain the no-cache pragma (Section 5.4), nor the no-cache cache directive,
241271 // unless the stored response is successfully validated (Section 4.3), and
242272 const requestCC = parseCacheControl ( req . headers [ 'cache-control' ] ) ;
273+
243274 if ( requestCC [ 'no-cache' ] || / n o - c a c h e / . test ( req . headers . pragma ) ) {
244- return false ;
275+ return this . _evaluateRequestMissResult ( req ) ;
245276 }
246277
247278 if ( requestCC [ 'max-age' ] && this . age ( ) > requestCC [ 'max-age' ] ) {
248- return false ;
279+ return this . _evaluateRequestMissResult ( req ) ;
249280 }
250281
251282 if ( requestCC [ 'min-fresh' ] && this . maxAge ( ) - this . age ( ) < toNumberOrZero ( requestCC [ 'min-fresh' ] ) ) {
252- return false ;
283+ return this . _evaluateRequestMissResult ( req ) ;
253284 }
254285
255286 // the stored response is either:
256287 // fresh, or allowed to be served stale
257- if ( this . stale ( ) ) {
288+ let revalidation ;
289+ const stale = this . stale ( ) ;
290+ if ( stale ) {
258291 let allowsStale = false ;
259292 if ( requestCC [ 'max-stale' ] && ! this . _rescc [ 'must-revalidate' ] ) {
260293 if ( requestCC [ 'max-stale' ] === true || requestCC [ 'max-stale' ] > this . age ( ) - this . maxAge ( ) ) {
@@ -263,15 +296,16 @@ module.exports = class CachePolicy {
263296 // Allow stale-while-revalidate queries to be served stale
264297 // even if must-revalidate is set as the revalidation should be happening in the background
265298 } else if ( this . useStaleWhileRevalidate ( ) ) {
299+ revalidation = this . _evaluateRequestRevalidation ( req , false ) ;
266300 allowsStale = true ;
267301 }
268302
269303 if ( ! allowsStale ) {
270- return false ;
304+ return this . _evaluateRequestMissResult ( req ) ;
271305 }
272306 }
273307
274- return true ;
308+ return this . _evaluateRequestHitResult ( stale , revalidation ) ;
275309 }
276310
277311 _requestMatches ( req , allowHeadMethod ) {
0 commit comments