Skip to content

Commit dd97882

Browse files
committed
Expose rawHeaders on the response argument to beforeResponse
1 parent be645b8 commit dd97882

File tree

3 files changed

+35
-2
lines changed

3 files changed

+35
-2
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
Headers,
1010
CompletedRequest,
1111
CompletedBody,
12-
Explainable
12+
Explainable,
13+
RawHeaders
1314
} from "../../types";
1415

1516
import { MaybePromise, Replace } from '../../util/type-utils';
@@ -432,11 +433,15 @@ export class FileHandlerDefinition extends Serializable implements RequestHandle
432433
}
433434
}
434435

436+
// This is different from CompletedResponse because CompletedResponse is a client request to Mockttp
437+
// whereas this is a real response from an upstream server that we modify before forwarding.
438+
// We aim for a similar shape, but they're not exactly the same.
435439
export interface PassThroughResponse {
436440
id: string;
437441
statusCode: number;
438442
statusMessage?: string;
439443
headers: Headers;
444+
rawHeaders: RawHeaders;
440445
body: CompletedBody;
441446
}
442447

src/rules/requests/request-handlers.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,8 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
521521
const completedRequest = await waitForCompletedRequest(clientReq);
522522
const modifiedReq = await this.beforeRequest({
523523
...completedRequest,
524-
headers: _.clone(completedRequest.headers)
524+
headers: _.cloneDeep(completedRequest.headers),
525+
rawHeaders: _.cloneDeep(completedRequest.rawHeaders)
525526
});
526527

527528
if (modifiedReq?.response) {
@@ -768,6 +769,7 @@ export class PassThroughHandler extends PassThroughHandlerDefinition {
768769
statusCode: serverStatusCode,
769770
statusMessage: serverRes.statusMessage,
770771
headers: serverHeaders,
772+
rawHeaders: _.cloneDeep(serverRawHeaders),
771773
body: buildBodyReader(body, serverHeaders)
772774
});
773775

test/integration/proxy.spec.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,32 @@ nodeOnly(() => {
683683
expect(response.statusCode).to.equal(200);
684684
});
685685

686+
it("should be able to examine a response's raw headers in beforeResponse", async () => {
687+
await remoteServer.forGet('/').thenCallback(() => ({
688+
status: 500,
689+
headers: {
690+
'UPPERCASE-HEADER': 'VALUE'
691+
}
692+
}));
693+
694+
await server.forGet(remoteServer.urlFor("/")).thenPassThrough({
695+
beforeResponse: (res) => {
696+
expect(res.headers).to.deep.equal({
697+
'uppercase-header': 'VALUE'
698+
});
699+
700+
expect(res.rawHeaders).to.deep.equal([
701+
['UPPERCASE-HEADER', 'VALUE']
702+
]);
703+
704+
return { status: 200, body: 'all good' };
705+
}
706+
});
707+
708+
let response = await request.get(remoteServer.urlFor("/"));
709+
expect(response).to.equal('all good');
710+
});
711+
686712
it("should be able to rewrite a response's status", async () => {
687713
await remoteServer.forGet('/').thenReply(404);
688714
await server.forGet(remoteServer.urlFor("/")).thenPassThrough({

0 commit comments

Comments
 (0)