From da98193602e3c9c32aa61280204e8d24448e4597 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 15 Jun 2023 17:58:10 -0700 Subject: [PATCH] Lock down server IPC address (#51378) This attempts to avoid IPv6 and IPv4 resolve issues across network setups by locking down our internal IPC requests to just one address for consistency. This way there aren't issues when `localhost` resolves to one or the other in different cases. x-ref: https://github.com/vercel/next.js/issues/49677 --- packages/next/src/server/lib/render-server.ts | 2 +- packages/next/src/server/lib/server-ipc/index.ts | 2 +- packages/next/src/server/lib/server-ipc/invoke-request.ts | 7 ++++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/next/src/server/lib/render-server.ts b/packages/next/src/server/lib/render-server.ts index 0fe872014c76a..5f4c72feeeddd 100644 --- a/packages/next/src/server/lib/render-server.ts +++ b/packages/next/src/server/lib/render-server.ts @@ -137,6 +137,6 @@ export async function initialize(opts: { return reject(err) } }) - server.listen(await getFreePort(), opts.hostname) + server.listen(await getFreePort(), '0.0.0.0') }) } diff --git a/packages/next/src/server/lib/server-ipc/index.ts b/packages/next/src/server/lib/server-ipc/index.ts index 04f030b46dc8f..4c3cbf9200bf6 100644 --- a/packages/next/src/server/lib/server-ipc/index.ts +++ b/packages/next/src/server/lib/server-ipc/index.ts @@ -63,7 +63,7 @@ export async function createIpcServer( ) const ipcPort = await new Promise((resolveIpc) => { - ipcServer.listen(0, server.hostname, () => { + ipcServer.listen(0, '0.0.0.0', () => { const addr = ipcServer.address() if (addr && typeof addr === 'object') { diff --git a/packages/next/src/server/lib/server-ipc/invoke-request.ts b/packages/next/src/server/lib/server-ipc/invoke-request.ts index b2f4694e70cf0..105cb139a9ec9 100644 --- a/packages/next/src/server/lib/server-ipc/invoke-request.ts +++ b/packages/next/src/server/lib/server-ipc/invoke-request.ts @@ -18,8 +18,13 @@ export const invokeRequest = async ( const http = require('http') as typeof import('http') try { + // force to 127.0.0.1 as IPC always runs on this hostname + // to avoid localhost issues + const parsedTargetUrl = new URL(targetUrl) + parsedTargetUrl.hostname = '127.0.0.1' + const invokeReq = http.request( - targetUrl, + parsedTargetUrl.toString(), { headers: invokeHeaders, method: requestInit.method,