diff --git a/.changeset/tasty-beans-give.md b/.changeset/tasty-beans-give.md new file mode 100644 index 0000000000..35431bd39f --- /dev/null +++ b/.changeset/tasty-beans-give.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Allow our Response wrapper to be cloneable diff --git a/packages/astro/src/runtime/server/response.ts b/packages/astro/src/runtime/server/response.ts index a39ceaa439..c64cdc1626 100644 --- a/packages/astro/src/runtime/server/response.ts +++ b/packages/astro/src/runtime/server/response.ts @@ -52,6 +52,14 @@ function createResponseClass() { } return super.arrayBuffer(); } + + clone() { + return new StreamingCompatibleResponse!(this.#body, { + status: this.status, + statusText: this.statusText, + headers: this.headers + }); + } }; return StreamingCompatibleResponse; diff --git a/packages/astro/test/fixtures/middleware-dev/src/middleware.js b/packages/astro/test/fixtures/middleware-dev/src/middleware.js index 2cc7cf2ca5..2f9fc08b91 100644 --- a/packages/astro/test/fixtures/middleware-dev/src/middleware.js +++ b/packages/astro/test/fixtures/middleware-dev/src/middleware.js @@ -18,6 +18,12 @@ const first = defineMiddleware(async (context, next) => { return new Response(JSON.stringify(object), { headers: response.headers, }); + } else if(context.url.pathname === '/clone') { + const response = await next(); + const newResponse = response.clone(); + const /** @type {string} */ html = await newResponse.text(); + const newhtml = html.replace('

testing

', '

it works

'); + return new Response(newhtml, { status: 200, headers: response.headers }); } else { if(context.url.pathname === '/') { context.cookies.set('foo', 'bar'); diff --git a/packages/astro/test/fixtures/middleware-dev/src/pages/clone.astro b/packages/astro/test/fixtures/middleware-dev/src/pages/clone.astro new file mode 100644 index 0000000000..28abcb9024 --- /dev/null +++ b/packages/astro/test/fixtures/middleware-dev/src/pages/clone.astro @@ -0,0 +1,12 @@ +--- + +--- + + + + Testing + + +

testing

+ + diff --git a/packages/astro/test/middleware.test.js b/packages/astro/test/middleware.test.js index 9e22131464..1ed857d5b0 100644 --- a/packages/astro/test/middleware.test.js +++ b/packages/astro/test/middleware.test.js @@ -73,6 +73,12 @@ describe('Middleware in DEV mode', () => { let res = await fixture.fetch('/'); expect(res.headers.get('set-cookie')).to.equal('foo=bar'); }); + + it('should be able to clone the response', async () => { + let res = await fixture.fetch('/clone'); + let html = await res.text(); + expect(html).to.contain('

it works

'); + }); }); describe('Middleware in PROD mode, SSG', () => {