@@ -25,7 +25,6 @@ const {
25
25
} = require ( "./utils/compatibleAPI" ) ;
26
26
const getFilenameFromUrl = require ( "./utils/getFilenameFromUrl" ) ;
27
27
const memorize = require ( "./utils/memorize" ) ;
28
- const parseTokenList = require ( "./utils/parseTokenList" ) ;
29
28
const ready = require ( "./utils/ready" ) ;
30
29
31
30
/** @typedef {import("./index.js").NextFunction } NextFunction */
@@ -116,6 +115,10 @@ const parseRangeHeaders = memorize(
116
115
} ,
117
116
) ;
118
117
118
+ const getETag = memorize ( ( ) => require ( "./utils/etag" ) ) ;
119
+ const getEscapeHtml = memorize ( ( ) => require ( "./utils/escapeHtml" ) ) ;
120
+ const getParseTokenList = memorize ( ( ) => require ( "./utils/parseTokenList" ) ) ;
121
+
119
122
const MAX_MAX_AGE = 31536000000 ;
120
123
121
124
/**
@@ -184,7 +187,7 @@ function wrapper(context) {
184
187
await goNext ( error ) ;
185
188
}
186
189
187
- const escapeHtml = require ( "./utils/escapeHtml" ) ;
190
+ const escapeHtml = getEscapeHtml ( ) ;
188
191
189
192
const content = statuses [ status ] || String ( status ) ;
190
193
let document = Buffer . from (
@@ -291,7 +294,7 @@ function wrapper(context) {
291
294
return (
292
295
! etag ||
293
296
( ifMatch !== "*" &&
294
- parseTokenList ( ifMatch ) . every (
297
+ getParseTokenList ( ) ( ifMatch ) . every (
295
298
( match ) =>
296
299
match !== etag &&
297
300
match !== `W/${ etag } ` &&
@@ -369,7 +372,7 @@ function wrapper(context) {
369
372
return false ;
370
373
}
371
374
372
- const matches = parseTokenList ( noneMatch ) ;
375
+ const matches = getParseTokenList ( ) ( noneMatch ) ;
373
376
374
377
let etagStale = true ;
375
378
@@ -632,13 +635,10 @@ function wrapper(context) {
632
635
const rangeHeader = getRangeHeader ( ) ;
633
636
634
637
if ( context . options . etag && ! getResponseHeader ( res , "ETag" ) ) {
635
- /** @type {import("fs").Stats | Buffer | ReadStream | undefined } */
636
- let value ;
638
+ const isStrongETag = context . options . etag === "strong" ;
637
639
638
- // TODO cache etag generation?
639
- if ( context . options . etag === "weak" ) {
640
- value = /** @type {import("fs").Stats } */ ( extra . stats ) ;
641
- } else {
640
+ // TODO cache strong etag generation?
641
+ if ( isStrongETag ) {
642
642
if ( rangeHeader ) {
643
643
const parsedRanges =
644
644
/** @type {import("range-parser").Ranges | import("range-parser").Result } */
@@ -663,32 +663,33 @@ function wrapper(context) {
663
663
end ,
664
664
) ;
665
665
666
- value = result . bufferOrStream ;
667
666
( { bufferOrStream, byteLength } = result ) ;
668
667
} catch ( error ) {
669
668
await errorHandler ( /** @type {NodeJS.ErrnoException } */ ( error ) ) ;
670
669
return ;
671
670
}
672
671
}
673
672
674
- if ( value ) {
675
- const result = await require ( "./utils/etag" ) ( value ) ;
676
-
677
- // Because we already read stream, we can cache buffer to avoid extra read from fs
678
- if ( result . buffer ) {
679
- bufferOrStream = result . buffer ;
680
- }
673
+ const result = await getETag ( ) (
674
+ isStrongETag
675
+ ? /** @type {Buffer | ReadStream } */ ( bufferOrStream )
676
+ : /** @type {import("fs").Stats } */ ( extra . stats ) ,
677
+ ) ;
681
678
682
- setResponseHeader ( res , "ETag" , result . hash ) ;
679
+ // Because we already read stream, we can cache buffer to avoid extra read from fs
680
+ if ( result . buffer ) {
681
+ bufferOrStream = result . buffer ;
683
682
}
683
+
684
+ setResponseHeader ( res , "ETag" , result . hash ) ;
684
685
}
685
686
686
687
if (
687
688
! getResponseHeader ( res , "Content-Type" ) ||
688
689
getStatusCode ( res ) === 404
689
690
) {
690
691
removeResponseHeader ( res , "Content-Type" ) ;
691
- // content-type name(like application/javascript; charset=utf-8) or false
692
+ // content-type name (like application/javascript; charset=utf-8) or false
692
693
const contentType = mime . contentType ( path . extname ( filename ) ) ;
693
694
694
695
// Only set content-type header if media type is known
0 commit comments