diff --git a/.changeset/fix-client-and-server-defects.md b/.changeset/fix-client-and-server-defects.md new file mode 100644 index 0000000000..04e996c606 --- /dev/null +++ b/.changeset/fix-client-and-server-defects.md @@ -0,0 +1,5 @@ +--- +"webpack-dev-server": minor +--- + +Fix client progress modes, socket URL credentials, overlay and progress lifecycles, server startup error handling and local IP lookup; export `BaseServer`. diff --git a/client-src/index.js b/client-src/index.js index e8a650ea3d..cf6f88fc3a 100644 --- a/client-src/index.js +++ b/client-src/index.js @@ -34,7 +34,7 @@ import sendMessage from "./utils/sendMessage.js"; * @typedef {object} Options * @property {boolean} hot true when hot enabled, otherwise false * @property {boolean} liveReload true when live reload enabled, otherwise false - * @property {boolean} progress true when need to show progress, otherwise false + * @property {boolean | "linear" | "circular"} progress progress display mode * @property {boolean | OverlayOptions} overlay overlay options * @property {LogLevel=} logging logging level * @property {number=} reconnect count of allowed reconnection @@ -129,10 +129,17 @@ const parseURL = (resourceQuery) => { const searchParams = resourceQuery.slice(1).split("&"); for (let i = 0; i < searchParams.length; i++) { - const pair = searchParams[i].split("="); - - /** @type {EXPECTED_ANY} */ - (result)[pair[0]] = decodeURIComponent(pair[1]); + const parameter = searchParams[i].replace(/\+/g, " "); + const separator = parameter.indexOf("="); + const key = separator === -1 ? parameter : parameter.slice(0, separator); + const value = separator === -1 ? "" : parameter.slice(separator + 1); + + try { + /** @type {EXPECTED_ANY} */ + (result)[decodeURIComponent(key)] = decodeURIComponent(value); + } catch { + // Ignore malformed percent escapes without preventing client startup. + } } } else { // Else, get the url from the