Skip to content

Commit 1624718

Browse files
committed
fix: handle more cache directives
1 parent 7c2f987 commit 1624718

File tree

1 file changed

+37
-28
lines changed

1 file changed

+37
-28
lines changed

lib/interceptor/cache.js

+37-28
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,26 @@ class CacheHandler extends DecoratorHandler {
4242
return super.onHeaders(statusCode, headers, resume)
4343
}
4444

45-
const cacheControl = parseCacheControl(headers['cache-control'])
45+
const cacheControlDirectives = parseCacheControl(headers['cache-control']) ?? {}
46+
47+
if (this.#key.headers.authorization && !cacheControlDirectives.public) {
48+
return super.onHeaders(statusCode, headers, resume)
49+
}
50+
51+
if (cacheControlDirectives.private || cacheControlDirectives['no-store']) {
52+
return super.onHeaders(statusCode, headers, resume)
53+
}
54+
4655
if (
47-
!cacheControl ||
48-
!cacheControl.public ||
49-
cacheControl.private ||
50-
cacheControl['no-store'] ||
51-
// TODO (fix): Support all cache control directives...
52-
// cacheControl['no-transform'] ||
53-
cacheControl['no-cache'] ||
54-
cacheControl['must-understand'] ||
55-
cacheControl['must-revalidate'] ||
56-
cacheControl['proxy-revalidate']
56+
cacheControlDirectives['no-transform'] ||
57+
cacheControlDirectives['must-revalidate'] ||
58+
cacheControlDirectives['proxy-revalidate'] ||
59+
cacheControlDirectives['must-understand'] ||
60+
cacheControlDirectives['stale-while-revalidate'] ||
61+
cacheControlDirectives['stale-if-error'] ||
62+
cacheControlDirectives['no-cache']
5763
) {
58-
// Not cacheble...
64+
// TODO (fix): Support all cache control directives...
5965
return super.onHeaders(statusCode, headers, resume)
6066
}
6167

@@ -76,9 +82,9 @@ class CacheHandler extends DecoratorHandler {
7682
return super.onHeaders(statusCode, headers, resume)
7783
}
7884

79-
const ttl = cacheControl.immutable
85+
const ttl = cacheControlDirectives.immutable
8086
? 31556952
81-
: Number(cacheControl['s-max-age'] ?? cacheControl['max-age'])
87+
: Number(cacheControlDirectives['s-max-age'] ?? cacheControlDirectives['max-age'])
8288
if (!ttl || !Number.isFinite(ttl) || ttl <= 0) {
8389
return super.onHeaders(statusCode, headers, resume)
8490
}
@@ -92,8 +98,8 @@ class CacheHandler extends DecoratorHandler {
9298
statusCode,
9399
statusMessage: '',
94100
headers,
95-
cacheControlDirectives: '',
96-
etag: '',
101+
cacheControlDirectives,
102+
etag: headers.etag,
97103
vary,
98104
cachedAt,
99105
staleAt: 0,
@@ -134,16 +140,17 @@ export default () => (dispatch) => (opts, handler) => {
134140
return dispatch(opts, handler)
135141
}
136142

137-
if (opts.headers?.['cache-control'] || opts.headers?.authorization) {
143+
const cacheControlDirectives = parseCacheControl(opts?.headers['cache-control']) ?? {}
144+
145+
if (
146+
cacheControlDirectives['max-age'] ||
147+
cacheControlDirectives['max-stale'] ||
148+
cacheControlDirectives['min-fresh'] ||
149+
cacheControlDirectives['no-cache'] ||
150+
cacheControlDirectives['no-transform'] ||
151+
cacheControlDirectives['stale-if-error']
152+
) {
138153
// TODO (fix): Support all cache control directives...
139-
// const cacheControl = cacheControlParser.parse(opts.headers['cache-control'])
140-
// cacheControl['no-cache']
141-
// cacheControl['no-store']
142-
// cacheControl['max-age']
143-
// cacheControl['max-stale']
144-
// cacheControl['min-fresh']
145-
// cacheControl['no-transform']
146-
// cacheControl['only-if-cached']
147154
return dispatch(opts, handler)
148155
}
149156

@@ -152,10 +159,12 @@ export default () => (dispatch) => (opts, handler) => {
152159

153160
const store = opts.cache.store ?? DEFAULT_STORE
154161
const entry = store.get(opts)
155-
if (!entry) {
162+
if (!entry && !cacheControlDirectives['only-if-cached']) {
156163
return dispatch(
157164
opts,
158-
new CacheHandler(undici.util.cache.makeCacheKey(opts), { store, handler }),
165+
cacheControlDirectives['no-store']
166+
? handler
167+
: new CacheHandler(undici.util.cache.makeCacheKey(opts), { store, handler }),
159168
)
160169
}
161170

@@ -174,7 +183,7 @@ export default () => (dispatch) => (opts, handler) => {
174183
}
175184
}
176185

177-
const { statusCode, headers } = entry
186+
const { statusCode, headers } = entry ?? { statusCode: 504, headers: {} }
178187
try {
179188
handler.onConnect(abort)
180189
if (aborted) {

0 commit comments

Comments
 (0)