@@ -40,7 +40,9 @@ import {
40
40
pairFlatRawHeaders ,
41
41
findRawHeaderIndex ,
42
42
dropDefaultHeaders ,
43
- validateHeader
43
+ validateHeader ,
44
+ updateRawHeaders ,
45
+ getHeaderValue
44
46
} from '../../util/header-utils' ;
45
47
import { streamToBuffer , asBuffer } from '../../util/buffer-utils' ;
46
48
import {
@@ -484,8 +486,6 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
484
486
let headersManuallyModified = false ;
485
487
486
488
if ( this . transformRequest ) {
487
- let headers = rawHeadersToObject ( rawHeaders ) ;
488
-
489
489
const {
490
490
replaceMethod,
491
491
updateHeaders,
@@ -502,14 +502,9 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
502
502
}
503
503
504
504
if ( updateHeaders ) {
505
- headers = {
506
- ...headers ,
507
- ...updateHeaders
508
- } ;
509
- headersManuallyModified = true ;
505
+ rawHeaders = updateRawHeaders ( rawHeaders , updateHeaders ) ;
510
506
} else if ( replaceHeaders ) {
511
- headers = { ...replaceHeaders } ;
512
- headersManuallyModified = true ;
507
+ rawHeaders = objectHeadersToRaw ( replaceHeaders ) ;
513
508
}
514
509
515
510
if ( replaceBody ) {
@@ -564,22 +559,22 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
564
559
// We always re-encode the body to match the resulting content-encoding header:
565
560
reqBodyOverride = await encodeBodyBuffer (
566
561
reqBodyOverride ,
567
- headers
562
+ rawHeaders
568
563
) ;
569
564
570
- headers [ 'content-length' ] = getContentLengthAfterModification (
565
+ const updatedCLHeader = getContentLengthAfterModification (
571
566
reqBodyOverride ,
572
567
clientReq . headers ,
573
- ( updateHeaders && updateHeaders [ 'content-length' ] !== undefined )
574
- ? headers // Iff you replaced the content length
575
- : replaceHeaders ,
568
+ ( updateHeaders && getHeaderValue ( updateHeaders , 'content-length' ) !== undefined )
569
+ ? rawHeaders // Iff you replaced the content length
570
+ : replaceHeaders
576
571
) ;
577
- }
578
572
579
- if ( headersManuallyModified || reqBodyOverride ) {
580
- // If the headers have been updated (implicitly or explicitly) we need to regenerate them. We avoid
581
- // this if possible, because it normalizes headers, which is slightly lossy (e.g. they're lowercased).
582
- rawHeaders = objectHeadersToRaw ( headers ) ;
573
+ if ( updatedCLHeader !== undefined ) {
574
+ rawHeaders = updateRawHeaders ( rawHeaders , {
575
+ 'content-length' : updatedCLHeader
576
+ } ) ;
577
+ }
583
578
}
584
579
} else if ( this . beforeRequest ) {
585
580
const clientRawHeaders = rawHeaders ;
@@ -827,9 +822,6 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
827
822
}
828
823
829
824
if ( this . transformResponse ) {
830
- let responseHeadersModified = false ;
831
- let serverHeaders = rawHeadersToObject ( serverRawHeaders ) ;
832
-
833
825
const {
834
826
replaceStatus,
835
827
updateHeaders,
@@ -847,14 +839,9 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
847
839
}
848
840
849
841
if ( updateHeaders ) {
850
- serverHeaders = {
851
- ...serverHeaders ,
852
- ...updateHeaders
853
- } ;
854
- responseHeadersModified = true ;
842
+ serverRawHeaders = updateRawHeaders ( serverRawHeaders , updateHeaders ) ;
855
843
} else if ( replaceHeaders ) {
856
- serverHeaders = { ...replaceHeaders } ;
857
- responseHeadersModified = true ;
844
+ serverRawHeaders = objectHeadersToRaw ( replaceHeaders ) ;
858
845
}
859
846
860
847
if ( replaceBody ) {
@@ -915,24 +902,23 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
915
902
// so we re-encode the body to match the resulting content-encoding header:
916
903
resBodyOverride = await encodeBodyBuffer (
917
904
resBodyOverride ,
918
- serverHeaders
905
+ serverRawHeaders
919
906
) ;
920
907
921
- serverHeaders [ 'content-length' ] = getContentLengthAfterModification (
908
+ const updatedCLHeader = getContentLengthAfterModification (
922
909
resBodyOverride ,
923
910
serverRes . headers ,
924
- ( updateHeaders && updateHeaders [ 'content-length' ] !== undefined )
925
- ? serverHeaders // Iff you replaced the content length
911
+ ( updateHeaders && getHeaderValue ( updateHeaders , 'content-length' ) !== undefined )
912
+ ? serverRawHeaders // Iff you replaced the content length
926
913
: replaceHeaders ,
927
914
method === 'HEAD' // HEAD responses are allowed mismatched content-length
928
915
) ;
929
- responseHeadersModified = true ;
930
- }
931
916
932
- if ( responseHeadersModified ) {
933
- // If the headers have been updated (implicitly or explicitly) we need to regenerate them. We avoid
934
- // this if possible, because it normalizes headers, which is slightly lossy (e.g. they're lowercased).
935
- serverRawHeaders = objectHeadersToRaw ( serverHeaders ) ;
917
+ if ( updatedCLHeader !== undefined ) {
918
+ serverRawHeaders = updateRawHeaders ( serverRawHeaders , {
919
+ 'content-length' : updatedCLHeader
920
+ } ) ;
921
+ }
936
922
}
937
923
} else if ( this . beforeResponse ) {
938
924
let modifiedRes : CallbackResponseResult | void ;
0 commit comments