diff --git a/.cspell.json b/.cspell.json index 4a7bc2be12..74d4c22a44 100644 --- a/.cspell.json +++ b/.cspell.json @@ -10,6 +10,7 @@ "memfs", "execa", "networkidle", + "bracketless", "ipaddr", "pageerror", "unmock", @@ -37,6 +38,7 @@ "FACCA", "darkgrey", "Consolas", + "httpxy", "peerigon", "Ichigo", "Kurosaki", diff --git a/lib/Server.js b/lib/Server.js index 70f131041f..a85d940f62 100644 --- a/lib/Server.js +++ b/lib/Server.js @@ -2969,6 +2969,14 @@ class Server { */ #parseHostnameFromHeader = function (header) { if (!header) return null; + + // Some proxies forward bracketless IPv6 literals (e.g. "::1") in the Host + // header. `new URL` cannot parse them, so when the header is itself a + // valid IPv6 literal we treat the whole header as the hostname. + if (ipaddr.IPv6.isValid(header)) { + return header; + } + try { // If the header does not have a scheme, prepend // so URL can parse it const parseUrl = new URL( diff --git a/migration-v6.md b/migration-v6.md index 5c768ab123..e441c93257 100644 --- a/migration-v6.md +++ b/migration-v6.md @@ -4,11 +4,11 @@ This document serves as a migration guide for `webpack-dev-server@6.0.0`. ## ⚠ Breaking Changes -- Minimum supported `Node.js` version is `20.9.0`. +- Minimum supported `Node.js` version is `22.15.0`. - Minimum supported `webpack` version is `5.101.0`. - Support for **SockJS** in the WebSocket transport has been removed. Now, only **native WebSocket** is supported, or **custom** client and server implementations can be used. - The options for passing to the `proxy` have changed. Please refer to the [http-proxy-middleware migration guide](https://github.com/chimurai/http-proxy-middleware/blob/master/MIGRATION.md) for details. -- Remove support for the spdy server type. Use the http2 server type instead; however, since Express does not work correctly with it, a custom server (e.g., Connect or Hono) should be used. +- Remove support for the spdy server type.Use the http2 server type instead; however, since Express does not work correctly with it, a custom server (e.g., Connect or Hono) should be used. v4: diff --git a/package-lock.json b/package-lock.json index 8f0c3c0a79..73dfcbe1f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "connect-history-api-fallback": "^2.0.0", "express": "^5.2.1", "graceful-fs": "^4.2.11", - "http-proxy-middleware": "^3.0.5", + "http-proxy-middleware": "^4.0.0-beta.5", "ipaddr.js": "^2.3.0", "launch-editor": "^2.13.2", "open": "^11.0.0", @@ -72,7 +72,7 @@ "expect": "^30.4.1", "hono": "^4.12.9", "html-webpack-plugin": "^5.6.3", - "http-proxy": "^1.18.1", + "httpxy": "^0.5.1", "husky": "^9.1.6", "jest-mock": "^30.4.1", "jsdom": "^29.1.1", @@ -4244,15 +4244,6 @@ "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "license": "MIT" }, - "node_modules/@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -10013,12 +10004,6 @@ "node": ">=6" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -10734,26 +10719,6 @@ "dev": true, "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -12104,45 +12069,27 @@ "url": "https://opencollective.com/express" } }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/http-proxy-middleware": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", - "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-4.0.0-beta.5.tgz", + "integrity": "sha512-MfX/V4s3KClxqrkNlNifS9xCgfsFZ051pzCbmHkC/8QIigCXCtTv2W8jgsbIxnmWl8gP3bszZdAuDQe9yuPHOQ==", "license": "MIT", "dependencies": { - "@types/http-proxy": "^1.17.15", - "debug": "^4.3.6", - "http-proxy": "^1.18.1", + "debug": "^4.4.3", + "httpxy": "^0.5.1", "is-glob": "^4.0.3", - "is-plain-object": "^5.0.0", + "is-plain-obj": "^4.1.0", "micromatch": "^4.0.8" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^22.12.0 || >=24.0.0" } }, - "node_modules/http-proxy-middleware/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "node_modules/httpxy": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.5.1.tgz", + "integrity": "sha512-JPhqYiixe1A1I+MXDewWDZqeudBGU8Q9jCHYN8ML+779RQzLjTi78HBvWz4jMxUD6h2/vUL12g4q/mFM0OUw1A==", + "license": "MIT" }, "node_modules/human-signals": { "version": "2.1.0", @@ -12789,6 +12736,18 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -17250,12 +17209,6 @@ "node": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -18045,19 +17998,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sort-package-json/node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/sort-package-json/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", diff --git a/package.json b/package.json index c5462e75c2..b43f54b849 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "connect-history-api-fallback": "^2.0.0", "express": "^5.2.1", "graceful-fs": "^4.2.11", - "http-proxy-middleware": "^3.0.5", + "http-proxy-middleware": "^4.0.0-beta.5", "ipaddr.js": "^2.3.0", "launch-editor": "^2.13.2", "open": "^11.0.0", @@ -104,7 +104,7 @@ "expect": "^30.4.1", "hono": "^4.12.9", "html-webpack-plugin": "^5.6.3", - "http-proxy": "^1.18.1", + "httpxy": "^0.5.1", "husky": "^9.1.6", "jest-mock": "^30.4.1", "jsdom": "^29.1.1", diff --git a/test/e2e/ipc.test.js b/test/e2e/ipc.test.js index cf82afa22a..43071f0c34 100644 --- a/test/e2e/ipc.test.js +++ b/test/e2e/ipc.test.js @@ -6,7 +6,7 @@ const os = require("node:os"); const path = require("node:path"); const { describe, it } = require("node:test"); const { expect } = require("expect"); -const httpProxy = require("http-proxy"); +const httpProxy = require("httpxy"); const webpack = require("webpack"); const Server = require("../../lib/Server"); const config = require("../fixtures/client-config/webpack.config");