From fe0bfbf9118cef355fd6f2f6e667deb57ad66e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 13 Oct 2023 19:58:33 +0200 Subject: [PATCH] fix: add `x-forwarded-*` headers (#56797) ### What? Adding back `x-forwarded-*` headers. ### Why? Starting with #52492, these headers were lost. ### How? We can populate these headers before executing a request. Closes NEXT-1663 Fixes #55942 --- packages/next/src/server/lib/router-server.ts | 12 ++++++++++++ test/e2e/app-dir/x-forwarded-headers/app/route.tsx | 3 +++ .../x-forwarded-headers/x-forwarded-headers.test.ts | 13 +++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 test/e2e/app-dir/x-forwarded-headers/app/route.tsx create mode 100644 test/e2e/app-dir/x-forwarded-headers/x-forwarded-headers.test.ts diff --git a/packages/next/src/server/lib/router-server.ts b/packages/next/src/server/lib/router-server.ts index 8774e0913f3bb..c725f6d70141e 100644 --- a/packages/next/src/server/lib/router-server.ts +++ b/packages/next/src/server/lib/router-server.ts @@ -33,6 +33,7 @@ import { PERMANENT_REDIRECT_STATUS, } from '../../shared/lib/constants' import { DevBundlerService } from './dev-bundler-service' +import type { TLSSocket } from 'tls' const debug = setupDebug('next:router-server:main') @@ -222,6 +223,17 @@ export async function initialize(opts: { 'x-middleware-invoke': '', 'x-invoke-path': invokePath, 'x-invoke-query': encodeURIComponent(JSON.stringify(parsedUrl.query)), + 'x-forwarded-host': + req.headers['x-forwarded-host'] ?? req.headers.host ?? opts.hostname, + 'x-forwarded-port': + req.headers['x-forwarded-port'] ?? opts.port.toString(), + 'x-forwarded-proto': + req.headers['x-forwarded-proto'] ?? + (req.socket as TLSSocket).encrypted + ? 'https' + : 'http', + 'x-forwarded-for': + req.headers['x-forwarded-for'] ?? req.socket.remoteAddress, ...(additionalInvokeHeaders || {}), } Object.assign(req.headers, invokeHeaders) diff --git a/test/e2e/app-dir/x-forwarded-headers/app/route.tsx b/test/e2e/app-dir/x-forwarded-headers/app/route.tsx new file mode 100644 index 0000000000000..d122485cd41fd --- /dev/null +++ b/test/e2e/app-dir/x-forwarded-headers/app/route.tsx @@ -0,0 +1,3 @@ +export function GET(req: Request) { + return Response.json(Object.fromEntries(req.headers)) +} diff --git a/test/e2e/app-dir/x-forwarded-headers/x-forwarded-headers.test.ts b/test/e2e/app-dir/x-forwarded-headers/x-forwarded-headers.test.ts new file mode 100644 index 0000000000000..00aca2a9182e2 --- /dev/null +++ b/test/e2e/app-dir/x-forwarded-headers/x-forwarded-headers.test.ts @@ -0,0 +1,13 @@ +import { createNextDescribe } from 'e2e-utils' + +createNextDescribe('x-forwarded-headers', { files: __dirname }, ({ next }) => { + it('should include x-forwarded-* headers', async () => { + const res = await next.fetch('/') + const headers = await res.json() + const url = new URL(next.url) + expect(headers['x-forwarded-host']).toBe(url.host) + expect(headers['x-forwarded-port']).toBe(url.port) + expect(headers['x-forwarded-proto']).toBe(url.protocol.replace(':', '')) + console.log(headers) + }) +})