Skip to content

Commit d6d4b8f

Browse files
authored
feat: hide x-opennext header from server requests when poweredByHeader is false (opennextjs#567)
* add: poweredByHeader can hide x-opennext header from server requests * add e2e test * add changeset * Revert "add changeset" This reverts commit 8cbd733. * add changeset in the root folder
1 parent bd2e058 commit d6d4b8f

File tree

6 files changed

+29
-2
lines changed

6 files changed

+29
-2
lines changed

.changeset/giant-vans-shop.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@opennextjs/aws": patch
3+
---
4+
5+
Hides the x-opennext header from server requests when poweredByHeader is false in next config

examples/pages-router/next.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ const nextConfig = {
5353
},
5454
],
5555
trailingSlash: true,
56+
poweredByHeader: true,
5657
};
5758

5859
module.exports = nextConfig;

packages/open-next/src/core/routing/util.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import crypto from "node:crypto";
22
import { OutgoingHttpHeaders } from "node:http";
33
import { Readable } from "node:stream";
44

5-
import { BuildId, HtmlPages } from "config/index.js";
5+
import { BuildId, HtmlPages, NextConfig } from "config/index.js";
66
import type { IncomingMessage, StreamCreator } from "http/index.js";
77
import { OpenNextNodeResponse } from "http/openNextResponse.js";
88
import { parseHeaders } from "http/util.js";
@@ -322,7 +322,9 @@ export function fixSWRCacheHeader(headers: OutgoingHttpHeaders) {
322322
* @__PURE__
323323
*/
324324
export function addOpenNextHeader(headers: OutgoingHttpHeaders) {
325-
headers["X-OpenNext"] = "1";
325+
if (NextConfig.poweredByHeader) {
326+
headers["X-OpenNext"] = "1";
327+
}
326328
if (globalThis.openNextDebug) {
327329
headers["X-OpenNext-Version"] = globalThis.openNextVersion;
328330
headers["X-OpenNext-RequestId"] = globalThis.__als.getStore()?.requestId;

packages/open-next/src/types/next-types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export interface NextConfig {
7575
appDir?: boolean;
7676
};
7777
images: ImageConfig;
78+
poweredByHeader?: boolean;
7879
}
7980

8081
export interface RouteDefinition {

packages/tests-e2e/tests/appRouter/headers.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,8 @@ test("Headers", async ({ page }) => {
2020
// Request header should be available in RSC
2121
let el = page.getByText(`request-header`);
2222
await expect(el).toBeVisible();
23+
24+
// Both these headers should not be present cause poweredByHeader is false in appRouter
25+
expect(headers["x-powered-by"]).toBeFalsy();
26+
expect(headers["x-opennext"]).toBeFalsy();
2327
});
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { expect, test } from "@playwright/test";
2+
3+
test("should test if poweredByHeader adds the correct headers ", async ({
4+
page,
5+
}) => {
6+
const result = await page.goto("/");
7+
expect(result).toBeDefined();
8+
expect(result?.status()).toBe(200);
9+
const headers = result?.headers();
10+
11+
// Both these headers should be present cause poweredByHeader is true in pagesRouter
12+
expect(headers?.["x-powered-by"]).toBe("Next.js");
13+
expect(headers?.["x-opennext"]).toBe("1");
14+
});

0 commit comments

Comments
 (0)