diff options
-rw-r--r-- | .changeset/tasty-beans-give.md | 5 | ||||
-rw-r--r-- | packages/astro/src/runtime/server/response.ts | 8 | ||||
-rw-r--r-- | packages/astro/test/fixtures/middleware-dev/src/middleware.js | 6 | ||||
-rw-r--r-- | packages/astro/test/fixtures/middleware-dev/src/pages/clone.astro | 12 | ||||
-rw-r--r-- | packages/astro/test/middleware.test.js | 6 |
5 files changed, 37 insertions, 0 deletions
diff --git a/.changeset/tasty-beans-give.md b/.changeset/tasty-beans-give.md new file mode 100644 index 000000000..35431bd39 --- /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 a39ceaa43..c64cdc162 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 2cc7cf2ca..2f9fc08b9 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('<h1>testing</h1>', '<h1>it works</h1>'); + 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 000000000..28abcb902 --- /dev/null +++ b/packages/astro/test/fixtures/middleware-dev/src/pages/clone.astro @@ -0,0 +1,12 @@ +--- + +--- + +<html> +<head> + <title>Testing</title> +</head> +<body> + <h1>testing</h1> +</body> +</html> diff --git a/packages/astro/test/middleware.test.js b/packages/astro/test/middleware.test.js index 9e2213146..1ed857d5b 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('<h1>it works</h1>'); + }); }); describe('Middleware in PROD mode, SSG', () => { |