Skip to content

Commit cf17bda

Browse files
niclimpimterry
authored andcommitted
fix updating host header when beforeRequest and forwarding is set
1 parent c6425e3 commit cf17bda

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

src/rules/requests/request-handlers.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,7 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
573573
const completedRequest = await waitForCompletedRequest(clientReq);
574574
const modifiedReq = await this.beforeRequest({
575575
...completedRequest,
576-
headers: _.cloneDeep(completedRequest.headers),
576+
headers: _.cloneDeep(rawHeadersToObject(completedRequest.rawHeaders)),
577577
rawHeaders: _.cloneDeep(completedRequest.rawHeaders)
578578
});
579579

@@ -597,16 +597,18 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
597597
reqUrl = modifiedReq?.url || reqUrl;
598598

599599
headersManuallyModified = !!modifiedReq?.headers;
600-
let headers = modifiedReq?.headers || clientReq.headers;
601-
600+
const clientHeaders = rawHeadersToObject(clientReq.rawHeaders)
601+
let headers = modifiedReq?.headers || clientHeaders;
602602
Object.assign(headers,
603603
isH2Downstream
604-
? getH2HeadersAfterModification(reqUrl, clientReq.headers, modifiedReq?.headers)
605-
: { 'host': getHostAfterModification(reqUrl, clientReq.headers, modifiedReq?.headers) }
604+
? getH2HeadersAfterModification(reqUrl, clientHeaders, modifiedReq?.headers)
605+
: !this.forwarding || !this.forwarding.updateHostHeader
606+
? { 'host': getHostAfterModification(reqUrl, clientHeaders, modifiedReq?.headers) }
607+
: {}
606608
);
607609

608610
validateCustomHeaders(
609-
clientReq.headers,
611+
clientHeaders,
610612
modifiedReq?.headers,
611613
OVERRIDABLE_REQUEST_PSEUDOHEADERS // These are handled by getCorrectPseudoheaders above
612614
);
@@ -617,7 +619,7 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
617619
// Automatically match the content-length to the body, unless it was explicitly overriden.
618620
headers['content-length'] = getContentLengthAfterModification(
619621
reqBodyOverride,
620-
clientReq.headers,
622+
clientHeaders,
621623
modifiedReq?.headers
622624
);
623625
}

test/integration/proxying/proxy-transforms.spec.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,19 @@ nodeOnly(() => {
102102
let seenRequests = await remoteEndpointMock.getSeenRequests();
103103
expect(seenRequests[0].headers.host).to.equal('google.com');
104104
});
105+
106+
it("can update the host header when used with beforeRequest", async () => {
107+
let remoteEndpointMock = await remoteServer.forGet('/get').thenReply(200, "mocked data");
108+
await server.forAnyRequest().thenForwardTo(remoteServer.url, {
109+
beforeRequest: () => {},
110+
forwarding: { updateHostHeader: true }
111+
});
112+
113+
await request.get(server.urlFor("/get"));
114+
115+
let seenRequests = await remoteEndpointMock.getSeenRequests();
116+
expect(seenRequests[0].headers.host).to.equal(`localhost:${remoteServer.port}`);
117+
});
105118
});
106119

107120
describe("that transforms requests automatically", () => {

0 commit comments

Comments
 (0)