@@ -42,20 +42,26 @@ class CacheHandler extends DecoratorHandler {
42
42
return super . onHeaders ( statusCode , headers , resume )
43
43
}
44
44
45
- const cacheControl = parseCacheControl ( headers [ 'cache-control' ] )
45
+ const cacheControl = parseCacheControl ( headers [ 'cache-control' ] ) ?? { }
46
+
47
+ if ( this . #key. headers . authorization && ! cacheControl . public ) {
48
+ return super . onHeaders ( statusCode , headers , resume )
49
+ }
50
+
51
+ if ( cacheControl . private || cacheControl [ 'no-store' ] ) {
52
+ return super . onHeaders ( statusCode , headers , resume )
53
+ }
54
+
46
55
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' ] ||
56
+ cacheControl [ 'no-transform' ] ||
55
57
cacheControl [ 'must-revalidate' ] ||
56
- cacheControl [ 'proxy-revalidate' ]
58
+ cacheControl [ 'proxy-revalidate' ] ||
59
+ cacheControl [ 'must-understand' ] ||
60
+ cacheControl [ 'stale-while-revalidate' ] ||
61
+ cacheControl [ 'stale-if-error' ] ||
62
+ cacheControl [ 'no-cache' ]
57
63
) {
58
- // Not cacheble ...
64
+ // TODO (fix): Support all cache control directives ...
59
65
return super . onHeaders ( statusCode , headers , resume )
60
66
}
61
67
@@ -134,16 +140,17 @@ export default () => (dispatch) => (opts, handler) => {
134
140
return dispatch ( opts , handler )
135
141
}
136
142
137
- if ( opts . headers ?. [ 'cache-control' ] || opts . headers ?. authorization ) {
143
+ const cacheControl = parseCacheControl ( opts ?. headers [ 'cache-control' ] ) ?? { }
144
+
145
+ if (
146
+ cacheControl [ 'max-age' ] ||
147
+ cacheControl [ 'max-stale' ] ||
148
+ cacheControl [ 'min-fresh' ] ||
149
+ cacheControl [ 'no-cache' ] ||
150
+ cacheControl [ 'no-transform' ] ||
151
+ cacheControl [ 'stale-if-error' ]
152
+ ) {
138
153
// 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']
147
154
return dispatch ( opts , handler )
148
155
}
149
156
@@ -152,10 +159,12 @@ export default () => (dispatch) => (opts, handler) => {
152
159
153
160
const store = opts . cache . store ?? DEFAULT_STORE
154
161
const entry = store . get ( opts )
155
- if ( ! entry ) {
162
+ if ( ! entry && ! cacheControl [ 'only-if-cached' ] ) {
156
163
return dispatch (
157
164
opts ,
158
- new CacheHandler ( undici . util . cache . makeCacheKey ( opts ) , { store, handler } ) ,
165
+ cacheControl [ 'no-store' ]
166
+ ? handler
167
+ : new CacheHandler ( undici . util . cache . makeCacheKey ( opts ) , { store, handler } ) ,
159
168
)
160
169
}
161
170
@@ -174,7 +183,7 @@ export default () => (dispatch) => (opts, handler) => {
174
183
}
175
184
}
176
185
177
- const { statusCode, headers } = entry
186
+ const { statusCode, headers } = entry ?? { statusCode : 504 , headers : { } }
178
187
try {
179
188
handler . onConnect ( abort )
180
189
if ( aborted ) {
0 commit comments