@@ -15,6 +15,7 @@ const {
15
15
setResponseHeader,
16
16
removeResponseHeader,
17
17
getResponseHeaders,
18
+ getHeadersSent,
18
19
send,
19
20
finish,
20
21
pipe,
@@ -494,56 +495,44 @@ function wrapper(context) {
494
495
return ;
495
496
}
496
497
498
+ if ( getHeadersSent ( res ) ) {
499
+ await goNext ( ) ;
500
+ return ;
501
+ }
502
+
497
503
const { size } = /** @type {import("fs").Stats } */ ( extra . stats ) ;
498
504
499
505
let len = size ;
500
506
let offset = 0 ;
501
507
502
508
// Send logic
503
- let { headers } = context . options ;
509
+ if ( context . options . headers ) {
510
+ let { headers } = context . options ;
504
511
505
- if ( typeof headers === "function" ) {
506
- headers = /** @type {NormalizedHeaders } */ ( headers ( req , res , context ) ) ;
507
- }
508
-
509
- /**
510
- * @type {{key: string, value: string | number}[] }
511
- */
512
- const allHeaders = [ ] ;
513
-
514
- if ( typeof headers !== "undefined" ) {
515
- if ( ! Array . isArray ( headers ) ) {
516
- // eslint-disable-next-line guard-for-in
517
- for ( const name in headers ) {
518
- allHeaders . push ( { key : name , value : headers [ name ] } ) ;
519
- }
520
-
521
- headers = allHeaders ;
512
+ if ( typeof headers === "function" ) {
513
+ headers = /** @type {NormalizedHeaders } */ (
514
+ headers ( req , res , context )
515
+ ) ;
522
516
}
523
517
524
- for ( const { key , value } of headers ) {
525
- setResponseHeader ( res , key , value ) ;
526
- }
527
- }
518
+ /**
519
+ * @type { { key: string , value: string | number}[] }
520
+ */
521
+ const allHeaders = [ ] ;
528
522
529
- if (
530
- ! getResponseHeader ( res , "Content-Type" ) ||
531
- getStatusCode ( res ) === 404
532
- ) {
533
- removeResponseHeader ( res , "Content-Type" ) ;
534
- // content-type name(like application/javascript; charset=utf-8) or false
535
- const contentType = mime . contentType ( path . extname ( filename ) ) ;
523
+ if ( typeof headers !== "undefined" ) {
524
+ if ( ! Array . isArray ( headers ) ) {
525
+ // eslint-disable-next-line guard-for-in
526
+ for ( const name in headers ) {
527
+ allHeaders . push ( { key : name , value : headers [ name ] } ) ;
528
+ }
536
529
537
- // Only set content-type header if media type is known
538
- // https://tools.ietf.org/html/rfc7231#section-3.1.1.5
539
- if ( contentType ) {
540
- setResponseHeader ( res , "Content-Type" , contentType ) ;
541
- } else if ( context . options . mimeTypeDefault ) {
542
- setResponseHeader (
543
- res ,
544
- "Content-Type" ,
545
- context . options . mimeTypeDefault ,
546
- ) ;
530
+ headers = allHeaders ;
531
+ }
532
+
533
+ for ( const { key, value } of headers ) {
534
+ setResponseHeader ( res , key , value ) ;
535
+ }
547
536
}
548
537
}
549
538
@@ -667,6 +656,27 @@ function wrapper(context) {
667
656
}
668
657
}
669
658
659
+ if (
660
+ ! getResponseHeader ( res , "Content-Type" ) ||
661
+ getStatusCode ( res ) === 404
662
+ ) {
663
+ removeResponseHeader ( res , "Content-Type" ) ;
664
+ // content-type name(like application/javascript; charset=utf-8) or false
665
+ const contentType = mime . contentType ( path . extname ( filename ) ) ;
666
+
667
+ // Only set content-type header if media type is known
668
+ // https://tools.ietf.org/html/rfc7231#section-3.1.1.5
669
+ if ( contentType ) {
670
+ setResponseHeader ( res , "Content-Type" , contentType ) ;
671
+ } else if ( context . options . mimeTypeDefault ) {
672
+ setResponseHeader (
673
+ res ,
674
+ "Content-Type" ,
675
+ context . options . mimeTypeDefault ,
676
+ ) ;
677
+ }
678
+ }
679
+
670
680
// Conditional GET support
671
681
if ( isConditionalGET ( ) ) {
672
682
if ( isPreconditionFailure ( ) ) {
0 commit comments