Skip to content

Commit 1e6e9ad

Browse files
Steven Goossenskornelski
authored andcommitted
Added a new 'evaluateRequest(req)' method that is able to support SWR
The implementation of 'satisfiesWithoutRevalidation(req)' using 'evaluateRequest(req)' is trivial.
1 parent 5bdc0ec commit 1e6e9ad

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

index.js

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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'] || /no-cache/.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) {

test/okhttptest.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ describe('okhttp tests', function() {
210210
assert.equal(cache.timeToLive(), 260000);
211211
});
212212

213-
it('stale-while-revalidate satisfies when stale', function() {
213+
it('stale-while-revalidate does not satisfy when stale because it requires revalidation', function() {
214214
const cache = new CachePolicy(
215215
{ headers: {} },
216216
{
@@ -224,10 +224,10 @@ describe('okhttp tests', function() {
224224

225225
assert(cache.stale());
226226
assert(cache.useStaleWhileRevalidate());
227-
assert(cache.satisfiesWithoutRevalidation({ headers: {} }));
227+
assert(!cache.satisfiesWithoutRevalidation({ headers: {} }));
228228
});
229229

230-
it('stale-while-revalidate satisfies when stale and must-revalidate', function() {
230+
it('stale-while-revalidate does not satisfy when stale and must-revalidate because it requires revalidation', function() {
231231
const cache = new CachePolicy(
232232
{ headers: {} },
233233
{
@@ -240,7 +240,7 @@ describe('okhttp tests', function() {
240240
);
241241

242242
assert(cache.stale());
243-
assert(cache.satisfiesWithoutRevalidation({ headers: {} }));
243+
assert(!cache.satisfiesWithoutRevalidation({ headers: {} }));
244244
});
245245

246246
it('stale-while-revalidate work with max-stale', function() {

0 commit comments

Comments
 (0)