diff --git a/cypress/e2e/middleware/enhanced.cy.ts b/cypress/e2e/middleware/enhanced.cy.ts index 60445f3140..2a05e6ee16 100644 --- a/cypress/e2e/middleware/enhanced.cy.ts +++ b/cypress/e2e/middleware/enhanced.cy.ts @@ -13,6 +13,12 @@ describe('Enhanced middleware', () => { }) }) + it('passes in headers within request.rewrite()', () => { + cy.request('/request-rewrite').then((response) => { + expect(response.headers).to.have.property('x-rewrite-test', 'hello') + }) + }) + it('rewrites the response body using request.next()', () => { cy.visit('/static') cy.get('#message').contains('This was static (& escaping test &) but has been transformed in') diff --git a/demos/middleware/middleware.ts b/demos/middleware/middleware.ts index 9206540da1..49941dd039 100644 --- a/demos/middleware/middleware.ts +++ b/demos/middleware/middleware.ts @@ -41,7 +41,13 @@ export async function middleware(req: NextRequest) { // skipMiddlewareUrlNormalize next config option is used so we have to try to match both html path and data blob path if (pathname.startsWith('/request-rewrite') || pathname.endsWith('/request-rewrite.json')) { // request.rewrite() should return the MiddlewareResponse object instead of the Response object. - const res = await request.rewrite('/static-rewrite') + const res = await request.rewrite('/static-rewrite', + { + headers: { + 'x-rewrite-test': 'hello', + 'x-rewrite-test-2': 'hello-2' + } + }) const message = `This was static (& escaping test &) but has been transformed in ${req.geo?.city}` // Transform the response HTML and props diff --git a/packages/next/src/middleware/response.ts b/packages/next/src/middleware/response.ts index 90b9a9244a..2f96c4877f 100644 --- a/packages/next/src/middleware/response.ts +++ b/packages/next/src/middleware/response.ts @@ -11,7 +11,6 @@ export class MiddlewareResponse extends NextResponse { private readonly dataTransforms: NextDataTransform[] private readonly elementHandlers: Array<[selector: string, handlers: ElementHandlers]> - // eslint-disable-next-line @typescript-eslint/no-unused-vars constructor(public originResponse: Response, init?: ResponseInit) { // we need to propagate the set-cookie header, so response.cookies.get works correctly const initHeaders = new Headers() @@ -23,6 +22,12 @@ export class MiddlewareResponse extends NextResponse { headers: initHeaders, }) + if (init?.headers) { + Object.entries(init.headers).forEach(([key, value]) => { + this.headers.set(key, value) + }) + } + // These are private in Node when compiling, but we access them in Deno at runtime Object.defineProperty(this, 'dataTransforms', { value: [],