Skip to content

Commit 08e2543

Browse files
authored
fix: handle 304 responses from edge functions (#364)
* test: add test for edge function returning 304 response * fix: maintain bodyless responses * fix: handle cancellations
1 parent 8ad4e63 commit 08e2543

File tree

4 files changed

+42
-19
lines changed

4 files changed

+42
-19
lines changed

packages/dev/src/main.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,14 @@ describe('Handling requests', () => {
606606
607607
export const config = { path: "/hello/terminate/*" };`,
608608
)
609+
.withFile(
610+
'netlify/edge-functions/bodyless-response.mjs',
611+
`export default async (req, context) => {
612+
return new Response(null, { status: 304 });
613+
};
614+
615+
export const config = { path: "/bodyless-response" };`,
616+
)
609617
const directory = await fixture.create()
610618

611619
vi.stubEnv('SOME_ZSH_THING_MAYBE', 'value on developer machine')
@@ -671,6 +679,11 @@ describe('Handling requests', () => {
671679
url: req2URL.toString(),
672680
})
673681

682+
const req3 = new Request('https://site.netlify/bodyless-response')
683+
const res3 = await dev.handle(req3)
684+
685+
expect(res3?.status).toBe(304)
686+
674687
await dev.stop()
675688
await fixture.destroy()
676689
})

packages/edge-functions/dev/deno/invoke.mjs

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* @param {number} requestTimeout
1515
*/
1616
export function invoke(req, functions, requestTimeout) {
17-
return new Promise((resolve, reject) => {
17+
return new Promise(async (resolve, reject) => {
1818
const worker = new Worker(new URL('./workers/runner.mjs', import.meta.url).href, {
1919
type: 'module',
2020
})
@@ -23,6 +23,8 @@ export function invoke(req, functions, requestTimeout) {
2323
let response = null
2424
/** @type {ReadableStreamDefaultController<Uint8Array> | null} */
2525
let streamController = null
26+
/** @type {ReadableStream | null} */
27+
let stream = null
2628

2729
const timeoutCheck = setTimeout(() => {
2830
if (!response) {
@@ -34,24 +36,6 @@ export function invoke(req, functions, requestTimeout) {
3436
}
3537
}, requestTimeout)
3638

37-
const stream = new ReadableStream({
38-
async start(controller) {
39-
streamController = controller
40-
41-
worker.postMessage({
42-
type: 'request',
43-
data: {
44-
body: await req.arrayBuffer(),
45-
functions,
46-
headers: Object.fromEntries(req.headers.entries()),
47-
method: req.method,
48-
timeout: requestTimeout,
49-
url: req.url,
50-
},
51-
})
52-
},
53-
})
54-
5539
worker.onmessage = (e) => {
5640
const message = /** @type {Message} */ (e.data)
5741

@@ -63,6 +47,18 @@ export function invoke(req, functions, requestTimeout) {
6347
}
6448

6549
case 'responseStart': {
50+
if (message.data.hasBody) {
51+
stream = new ReadableStream({
52+
start(controller) {
53+
streamController = controller
54+
},
55+
cancel() {
56+
streamController = null
57+
worker.terminate()
58+
},
59+
})
60+
}
61+
6662
response = new Response(stream, {
6763
headers: message.data.headers,
6864
status: message.data.status,
@@ -97,5 +93,17 @@ export function invoke(req, functions, requestTimeout) {
9793

9894
reject(e)
9995
}
96+
97+
worker.postMessage({
98+
type: 'request',
99+
data: {
100+
body: await req.arrayBuffer(),
101+
functions,
102+
headers: Object.fromEntries(req.headers.entries()),
103+
method: req.method,
104+
timeout: requestTimeout,
105+
url: req.url,
106+
},
107+
})
100108
})
101109
}

packages/edge-functions/dev/deno/workers/runner.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ worker.addEventListener('message', async (e) => {
5353
data: {
5454
headers: Object.fromEntries(res.headers.entries()),
5555
status: res.status,
56+
hasBody: Boolean(res.body),
5657
},
5758
}),
5859
)

packages/edge-functions/dev/deno/workers/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export interface RunResponseStartMessage {
4848
data: {
4949
headers: Record<string, string>
5050
status: number
51+
hasBody: boolean
5152
}
5253
}
5354

0 commit comments

Comments
 (0)