@@ -3,6 +3,7 @@ import {promisify} from 'util';
3
3
import { Readable as ReadableStream } from 'stream' ;
4
4
import { Agent } from 'http' ;
5
5
import { gzip } from 'zlib' ;
6
+ import process from 'process' ;
6
7
import test from 'ava' ;
7
8
import { pEvent } from 'p-event' ;
8
9
import getStream from 'get-stream' ;
@@ -471,3 +472,146 @@ test('response.complete is true when using keepalive agent', withServer, async (
471
472
472
473
t . true ( first . complete ) ;
473
474
} ) ;
475
+
476
+ test . failing ( 'revalidated uncompressed responses are retrieved from cache' , withServer , async ( t , server , got ) => {
477
+ let revalidated = false ;
478
+
479
+ const payload = JSON . stringify ( [ 1 ] ) ;
480
+
481
+ server . get ( '/' , ( request , response ) => {
482
+ if ( request . headers [ 'if-none-match' ] === 'asdf' ) {
483
+ revalidated = true ;
484
+ response . writeHead ( 304 , { etag : 'asdf' } ) ;
485
+ response . end ( ) ;
486
+ } else {
487
+ response . writeHead ( 200 , {
488
+ etag : 'asdf' ,
489
+ 'cache-control' : 'public, max-age=1, s-maxage=1' ,
490
+ 'content-type' : 'application/json' ,
491
+ } ) ;
492
+ response . write ( payload ) ;
493
+ response . end ( ) ;
494
+ }
495
+ } ) ;
496
+
497
+ t . timeout ( 5000 ) ;
498
+
499
+ const client = got . extend ( { cache : new Map ( ) , responseType : 'json' } ) ;
500
+
501
+ await client ( '' ) . then ( response => {
502
+ t . false ( revalidated ) ;
503
+ t . deepEqual ( response . body , [ 1 ] ) ;
504
+ t . true ( response . complete ) ;
505
+ } ) ;
506
+
507
+ // eslint-disable-next-line no-promise-executor-return
508
+ await new Promise ( resolve => setTimeout ( resolve , 3000 ) ) ;
509
+
510
+ console . log ( 'max-age has expired, performing second request' ) ;
511
+
512
+ await client ( '' ) . then ( response => {
513
+ t . true ( revalidated ) ;
514
+ t . deepEqual ( response . body , [ 1 ] ) ;
515
+ t . true ( response . complete ) ; // Fails here.
516
+ } ) ;
517
+ } ) ;
518
+
519
+ test . failing ( 'revalidated compressed responses are retrieved from cache' , withServer , async ( t , server , got ) => {
520
+ let revalidated = false ;
521
+
522
+ const payload = JSON . stringify ( [ 1 ] ) ;
523
+ const compressed = await promisify ( gzip ) ( payload ) ;
524
+
525
+ server . get ( '/' , ( request , response ) => {
526
+ if ( request . headers [ 'if-none-match' ] === 'asdf' ) {
527
+ revalidated = true ;
528
+ response . writeHead ( 304 , { etag : 'asdf' } ) ;
529
+ response . end ( ) ;
530
+ } else {
531
+ response . writeHead ( 200 , {
532
+ etag : 'asdf' ,
533
+ 'cache-control' : 'public, max-age=1, s-maxage=1' ,
534
+ 'content-type' : 'application/json' ,
535
+ 'content-encoding' : 'gzip' ,
536
+ } ) ;
537
+ response . write ( compressed ) ;
538
+ response . end ( ) ;
539
+ }
540
+ } ) ;
541
+
542
+ t . timeout ( 5000 ) ;
543
+
544
+ const client = got . extend ( { cache : new Map ( ) , responseType : 'json' } ) ;
545
+
546
+ await client ( '' ) . then ( response => {
547
+ t . false ( revalidated ) ;
548
+ t . deepEqual ( response . body , [ 1 ] ) ;
549
+ t . true ( response . complete ) ;
550
+ } ) ;
551
+
552
+ // eslint-disable-next-line no-promise-executor-return
553
+ await new Promise ( resolve => setTimeout ( resolve , 3000 ) ) ;
554
+
555
+ console . log ( 'max-age has expired, performing second request (but it will actually hang)' ) ;
556
+
557
+ await client ( '' ) . then ( response => {
558
+ t . true ( revalidated ) ;
559
+ t . deepEqual ( response . body , [ 1 ] ) ;
560
+ t . true ( response . complete ) ;
561
+ } ) ;
562
+ } ) ;
563
+
564
+ test . failing ( 'revalidated uncompressed responses from github are retrieved from cache' , async t => {
565
+ const client = got . extend ( {
566
+ cache : new Map ( ) ,
567
+ cacheOptions : { shared : false } ,
568
+ responseType : 'json' ,
569
+ headers : {
570
+ 'accept-encoding' : 'identity' ,
571
+ ...( process . env . GITHUB_TOKEN ? { authorization : `token ${ process . env . GITHUB_TOKEN } ` } : { } ) ,
572
+ } ,
573
+ } ) ;
574
+
575
+ t . timeout ( 70_000 ) ;
576
+
577
+ await client ( 'https://api.github.com/repos/octocat/Spoon-Knife' ) . then ( response => {
578
+ t . is ( ( response . body as any ) . name , 'Spoon-Knife' ) ;
579
+ t . true ( response . complete ) ;
580
+ } ) ;
581
+
582
+ // eslint-disable-next-line no-promise-executor-return
583
+ await new Promise ( resolve => setTimeout ( resolve , 65_000 ) ) ;
584
+
585
+ console . log ( 'max-age has expired, performing second request' ) ;
586
+
587
+ await client ( 'https://api.github.com/repos/octocat/Spoon-Knife' ) . then ( response => {
588
+ t . is ( ( response . body as any ) . name , 'Spoon-Knife' ) ;
589
+ t . true ( response . complete ) ; // Fails here.
590
+ } ) ;
591
+ } ) ;
592
+
593
+ test . failing ( 'revalidated compressed responses from github are retrieved from cache' , async t => {
594
+ const client = got . extend ( {
595
+ cache : new Map ( ) ,
596
+ cacheOptions : { shared : false } ,
597
+ responseType : 'json' ,
598
+ headers : process . env . GITHUB_TOKEN ? { authorization : `token ${ process . env . GITHUB_TOKEN } ` } : { } ,
599
+ } ) ;
600
+
601
+ t . timeout ( 70_000 ) ;
602
+
603
+ await client ( 'https://api.github.com/repos/octocat/Spoon-Knife' ) . then ( response => {
604
+ t . is ( ( response . body as any ) . name , 'Spoon-Knife' ) ;
605
+ t . true ( response . complete ) ;
606
+ } ) ;
607
+
608
+ // eslint-disable-next-line no-promise-executor-return
609
+ await new Promise ( resolve => setTimeout ( resolve , 65_000 ) ) ;
610
+
611
+ console . log ( 'max-age has expired, performing second request (but it will actually hang)' ) ;
612
+
613
+ await client ( 'https://api.github.com/repos/octocat/Spoon-Knife' ) . then ( response => {
614
+ t . is ( ( response . body as any ) . name , 'Spoon-Knife' ) ;
615
+ t . true ( response . complete ) ;
616
+ } ) ;
617
+ } ) ;
0 commit comments