Skip to content

Commit 138f064

Browse files
fix: accept connections with file: and chrome-extensions: protocol by default (#3822)
1 parent beaeb27 commit 138f064

File tree

4 files changed

+242
-0
lines changed

4 files changed

+242
-0
lines changed

lib/Server.js

+4
Original file line numberDiff line numberDiff line change
@@ -1850,6 +1850,10 @@ class Server {
18501850
return false;
18511851
}
18521852

1853+
if (/^(file|.+-extension):/i.test(hostHeader)) {
1854+
return true;
1855+
}
1856+
18531857
// use the node url-parser to retrieve the hostname from the host-header.
18541858
const hostname = url.parse(
18551859
// if hostHeader doesn't have scheme, add // for parsing.

test/e2e/__snapshots__/allowed-hosts.test.js.snap.webpack4

+44
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,50 @@ Array [
4444

4545
exports[`allowed hosts should connect web socket client using "127.0.0.1" host to web socket server with the "auto" value ("ws"): page errors 1`] = `Array []`;
4646

47+
exports[`allowed hosts should connect web socket client using "chrome-extension:" protocol to web socket server with the "auto" value ("sockjs"): console messages 1`] = `
48+
Array [
49+
"[HMR] Waiting for update signal from WDS...",
50+
"Hey.",
51+
"[webpack-dev-server] Hot Module Replacement enabled.",
52+
"[webpack-dev-server] Live Reloading enabled.",
53+
]
54+
`;
55+
56+
exports[`allowed hosts should connect web socket client using "chrome-extension:" protocol to web socket server with the "auto" value ("sockjs"): page errors 1`] = `Array []`;
57+
58+
exports[`allowed hosts should connect web socket client using "chrome-extension:" protocol to web socket server with the "auto" value ("ws"): console messages 1`] = `
59+
Array [
60+
"[HMR] Waiting for update signal from WDS...",
61+
"Hey.",
62+
"[webpack-dev-server] Hot Module Replacement enabled.",
63+
"[webpack-dev-server] Live Reloading enabled.",
64+
]
65+
`;
66+
67+
exports[`allowed hosts should connect web socket client using "chrome-extension:" protocol to web socket server with the "auto" value ("ws"): page errors 1`] = `Array []`;
68+
69+
exports[`allowed hosts should connect web socket client using "file:" protocol to web socket server with the "auto" value ("sockjs"): console messages 1`] = `
70+
Array [
71+
"[HMR] Waiting for update signal from WDS...",
72+
"Hey.",
73+
"[webpack-dev-server] Hot Module Replacement enabled.",
74+
"[webpack-dev-server] Live Reloading enabled.",
75+
]
76+
`;
77+
78+
exports[`allowed hosts should connect web socket client using "file:" protocol to web socket server with the "auto" value ("sockjs"): page errors 1`] = `Array []`;
79+
80+
exports[`allowed hosts should connect web socket client using "file:" protocol to web socket server with the "auto" value ("ws"): console messages 1`] = `
81+
Array [
82+
"[HMR] Waiting for update signal from WDS...",
83+
"Hey.",
84+
"[webpack-dev-server] Hot Module Replacement enabled.",
85+
"[webpack-dev-server] Live Reloading enabled.",
86+
]
87+
`;
88+
89+
exports[`allowed hosts should connect web socket client using "file:" protocol to web socket server with the "auto" value ("ws"): page errors 1`] = `Array []`;
90+
4791
exports[`allowed hosts should connect web socket client using custom hostname to web socket server with the "all" value ("sockjs"): console messages 1`] = `
4892
Array [
4993
"[HMR] Waiting for update signal from WDS...",

test/e2e/__snapshots__/allowed-hosts.test.js.snap.webpack5

+44
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,50 @@ Array [
4444

4545
exports[`allowed hosts should connect web socket client using "127.0.0.1" host to web socket server with the "auto" value ("ws"): page errors 1`] = `Array []`;
4646

47+
exports[`allowed hosts should connect web socket client using "chrome-extension:" protocol to web socket server with the "auto" value ("sockjs"): console messages 1`] = `
48+
Array [
49+
"[HMR] Waiting for update signal from WDS...",
50+
"Hey.",
51+
"[webpack-dev-server] Hot Module Replacement enabled.",
52+
"[webpack-dev-server] Live Reloading enabled.",
53+
]
54+
`;
55+
56+
exports[`allowed hosts should connect web socket client using "chrome-extension:" protocol to web socket server with the "auto" value ("sockjs"): page errors 1`] = `Array []`;
57+
58+
exports[`allowed hosts should connect web socket client using "chrome-extension:" protocol to web socket server with the "auto" value ("ws"): console messages 1`] = `
59+
Array [
60+
"[HMR] Waiting for update signal from WDS...",
61+
"Hey.",
62+
"[webpack-dev-server] Hot Module Replacement enabled.",
63+
"[webpack-dev-server] Live Reloading enabled.",
64+
]
65+
`;
66+
67+
exports[`allowed hosts should connect web socket client using "chrome-extension:" protocol to web socket server with the "auto" value ("ws"): page errors 1`] = `Array []`;
68+
69+
exports[`allowed hosts should connect web socket client using "file:" protocol to web socket server with the "auto" value ("sockjs"): console messages 1`] = `
70+
Array [
71+
"[HMR] Waiting for update signal from WDS...",
72+
"Hey.",
73+
"[webpack-dev-server] Hot Module Replacement enabled.",
74+
"[webpack-dev-server] Live Reloading enabled.",
75+
]
76+
`;
77+
78+
exports[`allowed hosts should connect web socket client using "file:" protocol to web socket server with the "auto" value ("sockjs"): page errors 1`] = `Array []`;
79+
80+
exports[`allowed hosts should connect web socket client using "file:" protocol to web socket server with the "auto" value ("ws"): console messages 1`] = `
81+
Array [
82+
"[HMR] Waiting for update signal from WDS...",
83+
"Hey.",
84+
"[webpack-dev-server] Hot Module Replacement enabled.",
85+
"[webpack-dev-server] Live Reloading enabled.",
86+
]
87+
`;
88+
89+
exports[`allowed hosts should connect web socket client using "file:" protocol to web socket server with the "auto" value ("ws"): page errors 1`] = `Array []`;
90+
4791
exports[`allowed hosts should connect web socket client using custom hostname to web socket server with the "all" value ("sockjs"): console messages 1`] = `
4892
Array [
4993
"[HMR] Waiting for update signal from WDS...",

test/e2e/allowed-hosts.test.js

+150
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,156 @@ describe("allowed hosts", () => {
380380
await server.stop();
381381
});
382382

383+
it(`should connect web socket client using "file:" protocol to web socket server with the "auto" value ("${webSocketServer}")`, async () => {
384+
const devServerHost = "127.0.0.1";
385+
const devServerPort = port1;
386+
const proxyHost = devServerHost;
387+
const proxyPort = port2;
388+
389+
const compiler = webpack(config);
390+
const devServerOptions = {
391+
client: {
392+
webSocketURL: {
393+
port: port2,
394+
},
395+
},
396+
webSocketServer,
397+
port: devServerPort,
398+
host: devServerHost,
399+
allowedHosts: "auto",
400+
};
401+
const server = new Server(devServerOptions, compiler);
402+
403+
await server.start();
404+
405+
function startProxy(callback) {
406+
const app = express();
407+
408+
app.use(
409+
"/",
410+
createProxyMiddleware({
411+
target: `http://${devServerHost}:${devServerPort}`,
412+
onProxyReqWs: (proxyReq) => {
413+
proxyReq.setHeader("origin", "file:///path/to/local/file.js");
414+
},
415+
ws: true,
416+
changeOrigin: true,
417+
logLevel: "warn",
418+
})
419+
);
420+
421+
return app.listen(proxyPort, proxyHost, callback);
422+
}
423+
424+
const proxy = await new Promise((resolve) => {
425+
const proxyCreated = startProxy(() => {
426+
resolve(proxyCreated);
427+
});
428+
});
429+
430+
const { page, browser } = await runBrowser();
431+
432+
const pageErrors = [];
433+
const consoleMessages = [];
434+
435+
page
436+
.on("console", (message) => {
437+
consoleMessages.push(message);
438+
})
439+
.on("pageerror", (error) => {
440+
pageErrors.push(error);
441+
});
442+
443+
await page.goto(`http://${proxyHost}:${proxyPort}/main`, {
444+
waitUntil: "networkidle0",
445+
});
446+
447+
expect(consoleMessages.map((message) => message.text())).toMatchSnapshot(
448+
"console messages"
449+
);
450+
expect(pageErrors).toMatchSnapshot("page errors");
451+
452+
proxy.close();
453+
454+
await browser.close();
455+
await server.stop();
456+
});
457+
458+
it(`should connect web socket client using "chrome-extension:" protocol to web socket server with the "auto" value ("${webSocketServer}")`, async () => {
459+
const devServerHost = "127.0.0.1";
460+
const devServerPort = port1;
461+
const proxyHost = devServerHost;
462+
const proxyPort = port2;
463+
464+
const compiler = webpack(config);
465+
const devServerOptions = {
466+
client: {
467+
webSocketURL: {
468+
port: port2,
469+
},
470+
},
471+
webSocketServer,
472+
port: devServerPort,
473+
host: devServerHost,
474+
allowedHosts: "auto",
475+
};
476+
const server = new Server(devServerOptions, compiler);
477+
478+
await server.start();
479+
480+
function startProxy(callback) {
481+
const app = express();
482+
483+
app.use(
484+
"/",
485+
createProxyMiddleware({
486+
target: `http://${devServerHost}:${devServerPort}`,
487+
onProxyReqWs: (proxyReq) => {
488+
proxyReq.setHeader("origin", "chrome-extension:///abcdef");
489+
},
490+
ws: true,
491+
changeOrigin: true,
492+
logLevel: "warn",
493+
})
494+
);
495+
496+
return app.listen(proxyPort, proxyHost, callback);
497+
}
498+
499+
const proxy = await new Promise((resolve) => {
500+
const proxyCreated = startProxy(() => {
501+
resolve(proxyCreated);
502+
});
503+
});
504+
505+
const { page, browser } = await runBrowser();
506+
507+
const pageErrors = [];
508+
const consoleMessages = [];
509+
510+
page
511+
.on("console", (message) => {
512+
consoleMessages.push(message);
513+
})
514+
.on("pageerror", (error) => {
515+
pageErrors.push(error);
516+
});
517+
518+
await page.goto(`http://${proxyHost}:${proxyPort}/main`, {
519+
waitUntil: "networkidle0",
520+
});
521+
522+
expect(consoleMessages.map((message) => message.text())).toMatchSnapshot(
523+
"console messages"
524+
);
525+
expect(pageErrors).toMatchSnapshot("page errors");
526+
527+
proxy.close();
528+
529+
await browser.close();
530+
await server.stop();
531+
});
532+
383533
it(`should connect web socket client using custom hostname to web socket server with the "all" value ("${webSocketServer}")`, async () => {
384534
const devServerHost = "127.0.0.1";
385535
const devServerPort = port1;

0 commit comments

Comments
 (0)