@@ -135,22 +135,30 @@ describe('Cache Interceptor', () => {
135
135
136
136
let requestsToOrigin = 0
137
137
let revalidationRequests = 0
138
+ let serverError
138
139
const server = createServer ( { joinDuplicateHeaders : true } , ( req , res ) => {
139
140
res . setHeader ( 'date' , 0 )
140
141
res . setHeader ( 'cache-control' , 's-maxage=1, stale-while-revalidate=10' )
141
142
142
- if ( req . headers [ 'if-modified-since' ] ) {
143
- revalidationRequests ++
143
+ try {
144
+ if ( req . headers [ 'if-modified-since' ] ) {
145
+ equal ( req . headers [ 'if-modified-since' ] . length , 29 )
146
+
147
+ revalidationRequests ++
144
148
145
- if ( revalidationRequests === 2 ) {
146
- res . end ( 'updated' )
149
+ if ( revalidationRequests === 3 ) {
150
+ res . end ( 'updated' )
151
+ } else {
152
+ res . statusCode = 304
153
+ res . end ( )
154
+ }
147
155
} else {
148
- res . statusCode = 304
149
- res . end ( )
156
+ requestsToOrigin ++
157
+ res . end ( 'asd' )
150
158
}
151
- } else {
152
- requestsToOrigin ++
153
- res . end ( 'asd' )
159
+ } catch ( err ) {
160
+ serverError = err
161
+ res . end ( )
154
162
}
155
163
} ) . listen ( 0 )
156
164
@@ -188,6 +196,10 @@ describe('Cache Interceptor', () => {
188
196
// Send initial request. This should reach the origin
189
197
{
190
198
const res = await client . request ( request )
199
+ if ( serverError ) {
200
+ throw serverError
201
+ }
202
+
191
203
equal ( requestsToOrigin , 1 )
192
204
equal ( revalidationRequests , 0 )
193
205
strictEqual ( await res . body . text ( ) , 'asd' )
@@ -198,16 +210,42 @@ describe('Cache Interceptor', () => {
198
210
// Response is now stale, the origin should get a revalidation request
199
211
{
200
212
const res = await client . request ( request )
213
+ if ( serverError ) {
214
+ throw serverError
215
+ }
216
+
201
217
equal ( requestsToOrigin , 1 )
202
218
equal ( revalidationRequests , 1 )
203
219
strictEqual ( await res . body . text ( ) , 'asd' )
204
220
}
205
221
222
+ // Response is still stale, extra header should be overwritten, and the
223
+ // origin should get a revalidation request
224
+ {
225
+ const res = await client . request ( {
226
+ ...request ,
227
+ headers : {
228
+ 'if-modified-SINCE' : 'Thu, 01 Jan 1970 00:00:00 GMT'
229
+ }
230
+ } )
231
+ if ( serverError ) {
232
+ throw serverError
233
+ }
234
+
235
+ equal ( requestsToOrigin , 1 )
236
+ equal ( revalidationRequests , 2 )
237
+ strictEqual ( await res . body . text ( ) , 'asd' )
238
+ }
239
+
206
240
// Response is still stale, but revalidation should fail now.
207
241
{
208
242
const res = await client . request ( request )
243
+ if ( serverError ) {
244
+ throw serverError
245
+ }
246
+
209
247
equal ( requestsToOrigin , 1 )
210
- equal ( revalidationRequests , 2 )
248
+ equal ( revalidationRequests , 3 )
211
249
strictEqual ( await res . body . text ( ) , 'updated' )
212
250
}
213
251
} )
@@ -230,7 +268,7 @@ describe('Cache Interceptor', () => {
230
268
231
269
equal ( req . headers [ 'if-none-match' ] , '"asd123"' )
232
270
233
- if ( revalidationRequests === 2 ) {
271
+ if ( revalidationRequests === 3 ) {
234
272
res . end ( 'updated' )
235
273
} else {
236
274
res . statusCode = 304
@@ -296,6 +334,24 @@ describe('Cache Interceptor', () => {
296
334
strictEqual ( await res . body . text ( ) , 'asd' )
297
335
}
298
336
337
+ // Response is still stale, extra headers should be overwritten, and the
338
+ // origin should get a revalidation request
339
+ {
340
+ const res = await client . request ( {
341
+ ...request ,
342
+ headers : {
343
+ 'if-NONE-match' : '"nonsense-etag"'
344
+ }
345
+ } )
346
+ if ( serverError ) {
347
+ throw serverError
348
+ }
349
+
350
+ equal ( requestsToOrigin , 1 )
351
+ equal ( revalidationRequests , 2 )
352
+ strictEqual ( await res . body . text ( ) , 'asd' )
353
+ }
354
+
299
355
// Response is still stale, but revalidation should fail now.
300
356
{
301
357
const res = await client . request ( request )
@@ -304,7 +360,7 @@ describe('Cache Interceptor', () => {
304
360
}
305
361
306
362
equal ( requestsToOrigin , 1 )
307
- equal ( revalidationRequests , 2 )
363
+ equal ( revalidationRequests , 3 )
308
364
strictEqual ( await res . body . text ( ) , 'updated' )
309
365
}
310
366
} )
@@ -327,13 +383,13 @@ describe('Cache Interceptor', () => {
327
383
if ( ifNoneMatch ) {
328
384
revalidationRequests ++
329
385
notEqual ( req . headers . a , undefined )
330
- notEqual ( req . headers . b , undefined )
386
+ notEqual ( req . headers [ 'b-mixed-case' ] , undefined )
331
387
332
388
res . statusCode = 304
333
389
res . end ( )
334
390
} else {
335
391
requestsToOrigin ++
336
- res . setHeader ( 'vary' , 'a, b ' )
392
+ res . setHeader ( 'vary' , 'a, B-MIXED-CASe ' )
337
393
res . setHeader ( 'etag' , '"asd"' )
338
394
res . end ( 'asd' )
339
395
}
@@ -360,15 +416,17 @@ describe('Cache Interceptor', () => {
360
416
const request = {
361
417
origin : 'localhost' ,
362
418
path : '/' ,
363
- method : 'GET' ,
364
- headers : {
365
- a : 'asd' ,
366
- b : 'asd'
367
- }
419
+ method : 'GET'
368
420
}
369
421
370
422
{
371
- const response = await client . request ( request )
423
+ const response = await client . request ( {
424
+ ...request ,
425
+ headers : {
426
+ a : 'asd' ,
427
+ 'b-Mixed-case' : 'asd'
428
+ }
429
+ } )
372
430
if ( serverError ) {
373
431
throw serverError
374
432
}
@@ -380,7 +438,13 @@ describe('Cache Interceptor', () => {
380
438
clock . tick ( 1500 )
381
439
382
440
{
383
- const response = await client . request ( request )
441
+ const response = await client . request ( {
442
+ ...request ,
443
+ headers : {
444
+ a : 'asd' ,
445
+ 'B-mixed-CASE' : 'asd'
446
+ }
447
+ } )
384
448
if ( serverError ) {
385
449
throw serverError
386
450
}
0 commit comments