From 1c77f3158592628f0df30864ab19e4f755dfd743 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 2 Oct 2024 14:37:38 +0100 Subject: [PATCH 1/2] fix: pass custom statusText in Response --- packages/astro/src/core/app/node.ts | 3 ++- .../astro/src/vite-plugin-astro-server/response.ts | 4 ++-- .../fixtures/ssr-api-route/src/pages/food.json.js | 11 ++++++++--- packages/astro/test/ssr-api-route.test.js | 12 ++++++++++++ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/packages/astro/src/core/app/node.ts b/packages/astro/src/core/app/node.ts index f9afa6189d5a..9fa1b645ff22 100644 --- a/packages/astro/src/core/app/node.ts +++ b/packages/astro/src/core/app/node.ts @@ -107,7 +107,8 @@ export class NodeApp extends App { * @param destination NodeJS ServerResponse */ static async writeResponse(source: Response, destination: ServerResponse) { - const { status, headers, body } = source; + const { status, headers, body, statusText } = source; + destination.statusMessage = statusText; destination.writeHead(status, createOutgoingHttpHeaders(headers)); if (!body) return destination.end(); try { diff --git a/packages/astro/src/vite-plugin-astro-server/response.ts b/packages/astro/src/vite-plugin-astro-server/response.ts index 707a26e4091c..bc316d7c21f2 100644 --- a/packages/astro/src/vite-plugin-astro-server/response.ts +++ b/packages/astro/src/vite-plugin-astro-server/response.ts @@ -53,7 +53,7 @@ export function writeHtmlResponse(res: http.ServerResponse, statusCode: number, } export async function writeWebResponse(res: http.ServerResponse, webResponse: Response) { - const { status, headers, body } = webResponse; + const { status, headers, body, statusText } = webResponse; // Attach any set-cookie headers added via Astro.cookies.set() const setCookieHeaders = Array.from(getSetCookiesFromResponse(webResponse)); @@ -67,7 +67,7 @@ export async function writeWebResponse(res: http.ServerResponse, webResponse: Re if (headers.has('set-cookie')) { _headers['set-cookie'] = headers.getSetCookie(); } - + res.statusMessage = statusText; res.writeHead(status, _headers); if (body) { if (Symbol.for('astro.responseBody') in webResponse) { diff --git a/packages/astro/test/fixtures/ssr-api-route/src/pages/food.json.js b/packages/astro/test/fixtures/ssr-api-route/src/pages/food.json.js index 2d6fb6d1b236..e145757b1342 100644 --- a/packages/astro/test/fixtures/ssr-api-route/src/pages/food.json.js +++ b/packages/astro/test/fixtures/ssr-api-route/src/pages/food.json.js @@ -5,14 +5,19 @@ export function GET() { { name: 'lettuce' }, { name: 'broccoli' }, { name: 'pizza' } - ]) + ]), { + status: 200, + statusText: `tasty`, + } ) } export async function POST({ params, request }) { const body = await request.text(); - return new Response(body === `some data` ? `ok` : `not ok`, { - status: 200, + const ok = body === `some data` + return new Response( ok ? `ok` : `not ok`, { + status: ok ? 200 : 400, + statusText: ok ? `ok` : `not ok`, headers: { 'Content-Type': 'application/x-www-form-urlencoded' } diff --git a/packages/astro/test/ssr-api-route.test.js b/packages/astro/test/ssr-api-route.test.js index 2e7405326fcc..ecdf458472e7 100644 --- a/packages/astro/test/ssr-api-route.test.js +++ b/packages/astro/test/ssr-api-route.test.js @@ -33,6 +33,7 @@ describe('API routes in SSR', () => { const request = new Request('http://example.com/food.json'); const response = await app.render(request); assert.equal(response.status, 200); + assert.equal(response.statusText, 'tasty'); const body = await response.json(); assert.equal(body.length, 3); }); @@ -78,6 +79,17 @@ describe('API routes in SSR', () => { assert.equal(text, 'ok'); }); + it('Can read custom status text from API routes', async () => { + const response = await fixture.fetch('/food.json', { + method: 'POST', + body: `not some data`, + }); + assert.equal(response.status, 400); + assert.equal(response.statusText, 'not ok'); + const text = await response.text(); + assert.equal(text, 'not ok'); + }); + it('Can be passed binary data from multipart formdata', async () => { const formData = new FormData(); const raw = await fs.promises.readFile( From d6f24f3250a46157e7aab9c16020365913787170 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 2 Oct 2024 14:42:08 +0100 Subject: [PATCH 2/2] Add changeset --- .changeset/moody-doors-wink.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/moody-doors-wink.md diff --git a/.changeset/moody-doors-wink.md b/.changeset/moody-doors-wink.md new file mode 100644 index 000000000000..38a7cadf9bd9 --- /dev/null +++ b/.changeset/moody-doors-wink.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Returns custom statusText that has been set in a Response