diff --git a/lib/interceptor/cache.js b/lib/interceptor/cache.js index 295c566f255..f7c42a08917 100644 --- a/lib/interceptor/cache.js +++ b/lib/interceptor/cache.js @@ -20,7 +20,12 @@ const { AbortError } = require('../core/errors.js') */ function needsRevalidation (result, cacheControlDirectives) { if (cacheControlDirectives?.['no-cache']) { - // Always revalidate requests with the no-cache directive + // Always revalidate requests with the no-cache request directive + return true + } + + if (result.cacheControlDirectives?.['no-cache'] && !Array.isArray(result.cacheControlDirectives['no-cache'])) { + // Always revalidate requests with unqualified no-cache response directive return true } diff --git a/test/interceptors/cache.js b/test/interceptors/cache.js index 6ea6ec35ea2..b458bff29bd 100644 --- a/test/interceptors/cache.js +++ b/test/interceptors/cache.js @@ -128,6 +128,45 @@ describe('Cache Interceptor', () => { } }) + test('revalidates reponses with no-cache directive, regardless of cacheByDefault', async () => { + let requestCount = 0 + const server = createServer({ joinDuplicateHeaders: true }, (req, res) => { + ++requestCount + res.setHeader('Vary', 'Accept-Encoding') + res.setHeader('cache-control', 'no-cache') + res.end(`Request count: ${requestCount}`) + }).listen(0) + + after(async () => { + server.close() + + await once(server, 'close') + }) + + await once(server, 'listening') + + const client = new Client(`http://localhost:${server.address().port}`) + .compose(interceptors.cache({ + cacheByDefault: 1000 + })) + + const request = { + origin: 'localhost', + method: 'GET', + path: '/' + } + + const res1 = await client.request(request) + const body1 = await res1.body.text() + strictEqual(body1, 'Request count: 1') + strictEqual(requestCount, 1) + + const res2 = await client.request(request) + const body2 = await res2.body.text() + strictEqual(body2, 'Request count: 2') + strictEqual(requestCount, 2) + }) + test('stale responses are revalidated before deleteAt (if-modified-since)', async () => { const clock = FakeTimers.install({ shouldClearNativeTimers: true