@@ -15,6 +15,7 @@ const {
1515 setResponseHeader,
1616 removeResponseHeader,
1717 getResponseHeaders,
18+ getHeadersSent,
1819 send,
1920 finish,
2021 pipe,
@@ -494,56 +495,44 @@ function wrapper(context) {
494495 return ;
495496 }
496497
498+ if ( getHeadersSent ( res ) ) {
499+ await goNext ( ) ;
500+ return ;
501+ }
502+
497503 const { size } = /** @type {import("fs").Stats } */ ( extra . stats ) ;
498504
499505 let len = size ;
500506 let offset = 0 ;
501507
502508 // Send logic
503- let { headers } = context . options ;
509+ if ( context . options . headers ) {
510+ let { headers } = context . options ;
504511
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+ ) ;
522516 }
523517
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 = [ ] ;
528522
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+ }
536529
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+ }
547536 }
548537 }
549538
@@ -667,6 +656,27 @@ function wrapper(context) {
667656 }
668657 }
669658
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+
670680 // Conditional GET support
671681 if ( isConditionalGET ( ) ) {
672682 if ( isPreconditionFailure ( ) ) {
0 commit comments