Skip to content

Commit cc83fdf

Browse files
committed
Fix a forwarding bug where the headers were modified in request events
Request events are intended to show the original unmodified client input, but this was lost as forwarding mutated the raw headers.
1 parent 8db0952 commit cc83fdf

File tree

2 files changed

+18
-7
lines changed

2 files changed

+18
-7
lines changed

src/rules/requests/request-handlers.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ import {
3939
rawHeadersToObjectPreservingCase,
4040
flattenPairedRawHeaders,
4141
findRawHeader,
42-
pairFlatRawHeaders
42+
pairFlatRawHeaders,
43+
findRawHeaderIndex
4344
} from '../../util/header-utils';
4445
import { streamToBuffer, asBuffer } from '../../util/buffer-utils';
4546
import {
@@ -437,12 +438,18 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
437438

438439
const hostHeaderName = isH2Downstream ? ':authority' : 'host';
439440

440-
let hostHeader = findRawHeader(rawHeaders, hostHeaderName);
441-
if (!hostHeader) {
441+
let hostHeaderIndex = findRawHeaderIndex(rawHeaders, hostHeaderName);
442+
let hostHeader: [string, string];
443+
444+
if (hostHeaderIndex === -1) {
442445
// Should never happen really, but just in case:
443446
hostHeader = [hostHeaderName, hostname!];
444-
rawHeaders.unshift(hostHeader);
445-
};
447+
hostHeaderIndex = rawHeaders.length;
448+
} else {
449+
// Clone this - we don't want to modify the original headers, as they're used for events
450+
hostHeader = _.clone(rawHeaders[hostHeaderIndex]);
451+
}
452+
rawHeaders[hostHeaderIndex] = hostHeader;
446453

447454
if (updateHostHeader === undefined || updateHostHeader === true) {
448455
// If updateHostHeader is true, or just not specified, match the new target
@@ -554,10 +561,11 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
554561
rawHeaders = objectHeadersToRaw(headers);
555562
}
556563
} else if (this.beforeRequest) {
557-
const completedRequest = await waitForCompletedRequest(clientReq);
558-
const clientRawHeaders = completedRequest.rawHeaders;
564+
const clientRawHeaders = rawHeaders;
559565
const clientHeaders = rawHeadersToObject(clientRawHeaders);
560566

567+
const completedRequest = await waitForCompletedRequest(clientReq);
568+
561569
const modifiedReq = await this.beforeRequest({
562570
...completedRequest,
563571
url: reqUrl, // May have been overwritten by forwarding

src/util/header-utils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ with. Those are:
2424
export const findRawHeader = (rawHeaders: RawHeaders, targetKey: string) =>
2525
rawHeaders.find(([key]) => key.toLowerCase() === targetKey);
2626

27+
export const findRawHeaderIndex = (rawHeaders: RawHeaders, targetKey: string) =>
28+
rawHeaders.findIndex(([key]) => key.toLowerCase() === targetKey);
29+
2730
const findRawHeaders = (rawHeaders: RawHeaders, targetKey: string) =>
2831
rawHeaders.filter(([key]) => key.toLowerCase() === targetKey);
2932

0 commit comments

Comments
 (0)