Skip to content

Commit bc912be

Browse files
committed
Fix a bug that normalized all headers for remote passthrough rules
Rules were serialized & deserialized such that transformReq/Res was always an object, even if it was initially unset, which means the normalization for that was always run. That step also always normalized headers even when nothing was actually transformed. In practice, this meant with remotely defined passthrough rules, header names were all lowercased & deduped, rather than preserving the initial raw state. This is now improved somewhat: we serialized & deserialize to avoid this, and we add some checks to avoid normalizing in a couple of cases. In future we can probably best improve this by supporting rawHeaders in transforms & callbacks, but that's a non-breaking change we can ignore for now.
1 parent d4409cb commit bc912be

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

src/rules/requests/request-handler-definitions.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -915,7 +915,7 @@ export class PassThroughHandlerDefinition extends Serializable implements Reques
915915
clientCertificateHostMap: _.mapValues(this.clientCertificateHostMap,
916916
({ pfx, passphrase }) => ({ pfx: serializeBuffer(pfx), passphrase })
917917
),
918-
transformRequest: {
918+
transformRequest: this.transformRequest ? {
919919
...this.transformRequest,
920920
// Body is always serialized as a base64 buffer:
921921
replaceBody: !!this.transformRequest?.replaceBody
@@ -934,8 +934,8 @@ export class PassThroughHandlerDefinition extends Serializable implements Reques
934934
(k, v) => v === undefined ? SERIALIZED_OMIT : v
935935
)
936936
: undefined
937-
},
938-
transformResponse: {
937+
} : undefined,
938+
transformResponse: this.transformResponse ? {
939939
...this.transformResponse,
940940
// Body is always serialized as a base64 buffer:
941941
replaceBody: !!this.transformResponse?.replaceBody
@@ -954,7 +954,7 @@ export class PassThroughHandlerDefinition extends Serializable implements Reques
954954
(k, v) => v === undefined ? SERIALIZED_OMIT : v
955955
)
956956
: undefined
957-
},
957+
} : undefined,
958958
hasBeforeRequestCallback: !!this.beforeRequest,
959959
hasBeforeResponseCallback: !!this.beforeResponse
960960
};

src/rules/requests/request-handlers.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,11 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
518518
);
519519
}
520520

521-
rawHeaders = objectHeadersToRaw(headers);
521+
if (headersManuallyModified || reqBodyOverride) {
522+
// If the headers have been updated (implicitly or explicitly) we need to regenerate them. We avoid
523+
// this if possible, because it normalizes headers, which is slightly lossy (e.g. they're lowercased).
524+
rawHeaders = objectHeadersToRaw(headers);
525+
}
522526
} else if (this.beforeRequest) {
523527
const completedRequest = await waitForCompletedRequest(clientReq);
524528
const modifiedReq = await this.beforeRequest({
@@ -962,7 +966,7 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
962966
beforeRequest,
963967
beforeResponse,
964968
proxyConfig: deserializeProxyConfig(data.proxyConfig, channel, ruleParams),
965-
transformRequest: {
969+
transformRequest: data.transformRequest ? {
966970
...data.transformRequest,
967971
...(data.transformRequest?.replaceBody !== undefined ? {
968972
replaceBody: deserializeBuffer(data.transformRequest.replaceBody)
@@ -973,8 +977,8 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
973977
...(data.transformRequest?.updateJsonBody !== undefined ? {
974978
updateJsonBody: mapOmitToUndefined(JSON.parse(data.transformRequest.updateJsonBody))
975979
} : {}),
976-
} as RequestTransform,
977-
transformResponse: {
980+
} as RequestTransform : undefined,
981+
transformResponse: data.transformResponse ? {
978982
...data.transformResponse,
979983
...(data.transformResponse?.replaceBody !== undefined ? {
980984
replaceBody: deserializeBuffer(data.transformResponse.replaceBody)
@@ -985,7 +989,7 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
985989
...(data.transformResponse?.updateJsonBody !== undefined ? {
986990
updateJsonBody: mapOmitToUndefined(JSON.parse(data.transformResponse.updateJsonBody))
987991
} : {})
988-
} as ResponseTransform,
992+
} as ResponseTransform : undefined,
989993
// Backward compat for old clients:
990994
...data.forwardToLocation ? {
991995
forwarding: { targetHost: data.forwardToLocation }

0 commit comments

Comments
 (0)