Skip to content

Commit 21b5649

Browse files
committed
fix(rsc-mf): guard no-body statuses in proxy responses
1 parent 4f3cb6a commit 21b5649

2 files changed

Lines changed: 29 additions & 1 deletion

File tree

tests/integration/rsc-mf/shared/proxyResponse.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const PROXY_UNSAFE_RESPONSE_HEADERS = [
1111
'transfer-encoding',
1212
'upgrade',
1313
];
14+
const STATUS_CODES_WITHOUT_BODY = new Set([204, 205, 304]);
1415

1516
export const createSafeProxyResponse = (upstream: Response) => {
1617
const headers = new Headers(upstream.headers);
@@ -31,7 +32,10 @@ export const createSafeProxyResponse = (upstream: Response) => {
3132
for (const token of connectionHeaderTokens) {
3233
headers.delete(token);
3334
}
34-
return new Response(upstream.body, {
35+
const responseBody = STATUS_CODES_WITHOUT_BODY.has(upstream.status)
36+
? null
37+
: upstream.body;
38+
return new Response(responseBody, {
3539
status: upstream.status,
3640
statusText: upstream.statusText,
3741
headers,

tests/integration/rsc-mf/tests/proxyResponse.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,28 @@ describe('rsc-mf proxy response helper', () => {
8181
expect(proxied.headers.get('keep-alive')).toBeNull();
8282
expect(proxied.headers.get('x-safe-header')).toBe('preserve-me');
8383
});
84+
85+
it('forces empty body for no-content status responses', async () => {
86+
const upstream = {
87+
status: 204,
88+
statusText: 'No Content',
89+
headers: new Headers({
90+
'content-type': 'application/javascript',
91+
}),
92+
body: new ReadableStream({
93+
start(controller) {
94+
controller.enqueue(
95+
new TextEncoder().encode('should-not-be-forwarded'),
96+
);
97+
controller.close();
98+
},
99+
}),
100+
} as unknown as Response;
101+
102+
const proxied = createSafeProxyResponse(upstream);
103+
104+
expect(proxied.status).toBe(204);
105+
expect(proxied.statusText).toBe('No Content');
106+
await expect(proxied.text()).resolves.toBe('');
107+
});
84108
});

0 commit comments

Comments
 (0)