Skip to content

Commit 452c6cf

Browse files
authored
Merge pull request #138 from niclim/fix/update-host-header-with-beforeRequest
fix updating host header when beforeRequest and forwarding is set
2 parents c6425e3 + 4567b4f commit 452c6cf

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

src/rules/requests/request-handlers.ts

Lines changed: 12 additions & 10 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-
602-
Object.assign(headers,
603-
isH2Downstream
604-
? getH2HeadersAfterModification(reqUrl, clientReq.headers, modifiedReq?.headers)
605-
: { 'host': getHostAfterModification(reqUrl, clientReq.headers, modifiedReq?.headers) }
606-
);
600+
const clientHeaders = rawHeadersToObject(clientReq.rawHeaders)
601+
let headers = modifiedReq?.headers || clientHeaders;
602+
if (!this.forwarding || this.forwarding.updateHostHeader === false) {
603+
Object.assign(headers,
604+
isH2Downstream
605+
? getH2HeadersAfterModification(reqUrl, clientHeaders, modifiedReq?.headers)
606+
: { 'host': getHostAfterModification(reqUrl, clientHeaders, modifiedReq?.headers) }
607+
);
608+
}
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)