Skip to content

Commit 2b3b7e0

Browse files
authoredAug 10, 2022
fix: response correctly when receive an OPTIONS request (#4185)
1 parent 480f1e1 commit 2b3b7e0

File tree

3 files changed

+107
-0
lines changed

3 files changed

+107
-0
lines changed
 

‎lib/Server.js

+26
Original file line numberDiff line numberDiff line change
@@ -2131,6 +2131,32 @@ class Server {
21312131
});
21322132
}
21332133

2134+
{
2135+
/**
2136+
*
2137+
* @param {Request} req
2138+
* @param {Response} res
2139+
* @param {NextFunction} next
2140+
* @returns {void}
2141+
*
2142+
*/
2143+
const optionsRequestResponseMiddleware = (req, res, next) => {
2144+
if (req.method === "OPTIONS") {
2145+
res.statusCode = 204;
2146+
res.setHeader("Content-Length", "0");
2147+
res.end();
2148+
return;
2149+
}
2150+
next();
2151+
};
2152+
2153+
middlewares.push({
2154+
name: "options-middleware",
2155+
path: "*",
2156+
middleware: optionsRequestResponseMiddleware,
2157+
});
2158+
}
2159+
21342160
middlewares.push({
21352161
name: "webpack-dev-middleware",
21362162
middleware:

‎test/e2e/options-middleware.test.js

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
"use strict";
2+
3+
const webpack = require("webpack");
4+
const Express = require("express");
5+
const Server = require("../../lib/Server");
6+
const config = require("../fixtures/client-config/webpack.config");
7+
const runBrowser = require("../helpers/run-browser");
8+
const port = require("../ports-map")["options-request-response"];
9+
10+
const createWaiting = () => {
11+
let reslove;
12+
let reject;
13+
const waiting = new Promise((resolve$, reject$) => {
14+
reslove = resolve$;
15+
reject = reject$;
16+
});
17+
return {
18+
reslove,
19+
reject,
20+
waiting,
21+
};
22+
};
23+
24+
describe("handle options-request correctly", () => {
25+
it("should response with 200 http code", async () => {
26+
const compiler = webpack(config);
27+
const [portForServer, portForApp] = port;
28+
const closeApp = await (async () => {
29+
const { reslove, waiting } = createWaiting();
30+
const app = new Express();
31+
app.get("/", (req, res) => {
32+
res.sendStatus(200);
33+
});
34+
const server = app.listen(portForApp, () => {
35+
reslove();
36+
});
37+
await waiting;
38+
return async () => {
39+
const { reslove: reslove2, waiting: waiting2 } = createWaiting();
40+
server.close(() => {
41+
reslove2();
42+
});
43+
await waiting2;
44+
};
45+
})();
46+
const server = new Server(
47+
{
48+
port: portForServer,
49+
headers: {
50+
"Access-Control-Allow-Origin": "*",
51+
"Access-Control-Allow-Headers": "*",
52+
},
53+
},
54+
compiler
55+
);
56+
await server.start();
57+
const { page, browser } = await runBrowser();
58+
const prefixUrl = "http://127.0.0.1";
59+
const htmlUrl = `${prefixUrl}:${portForServer}/test.html`;
60+
const appUrl = `${prefixUrl}:${portForApp}`;
61+
await page.goto(appUrl);
62+
const responseStatus = [];
63+
page.on("response", (res) => {
64+
responseStatus.push(res.status());
65+
});
66+
await page.evaluate(
67+
(url) =>
68+
window.fetch(url, {
69+
headers: {
70+
"another-header": "1",
71+
},
72+
}),
73+
htmlUrl
74+
);
75+
await browser.close();
76+
await server.stop();
77+
await closeApp();
78+
expect(responseStatus).toEqual([204, 200]);
79+
});
80+
});

‎test/ports-map.js

+1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ const listOfTests = {
7979
"server-option": 1,
8080
"normalize-option": 1,
8181
"setup-middlewares-option": 1,
82+
"options-request-response": 2,
8283
};
8384

8485
let startPort = 8089;

0 commit comments

Comments
 (0)
Please sign in to comment.