Skip to content

Commit 63f181c

Browse files
committedJun 20, 2023
feat: serve client bundles with CORS headers
The version of the `cors` package matches the one used by `engine.io`. Related: #3552
1 parent a250e28 commit 63f181c

File tree

4 files changed

+41
-2
lines changed

4 files changed

+41
-2
lines changed
 

‎lib/index.ts

+17-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import {
4040
SecondArg,
4141
} from "./typed-events";
4242
import { patchAdapter, restoreAdapter, serveFile } from "./uws";
43+
import corsMiddleware from "cors";
4344

4445
const debug = debugModule("socket.io:server");
4546

@@ -202,6 +203,11 @@ export class Server<
202203
*/
203204
_connectTimeout: number;
204205
private httpServer: http.Server | HTTPSServer | Http2SecureServer;
206+
private _corsMiddleware: (
207+
req: http.IncomingMessage,
208+
res: http.ServerResponse,
209+
next: () => void
210+
) => void;
205211

206212
/**
207213
* Server constructor.
@@ -267,6 +273,10 @@ export class Server<
267273
this.attach(
268274
srv as http.Server | HTTPSServer | Http2SecureServer | number
269275
);
276+
277+
if (this.opts.cors) {
278+
this._corsMiddleware = corsMiddleware(this.opts.cors);
279+
}
270280
}
271281

272282
get _opts() {
@@ -548,7 +558,13 @@ export class Server<
548558
srv.removeAllListeners("request");
549559
srv.on("request", (req, res) => {
550560
if (this.clientPathRegex.test(req.url!)) {
551-
this.serve(req, res);
561+
if (this._corsMiddleware) {
562+
this._corsMiddleware(req, res, () => {
563+
this.serve(req, res);
564+
});
565+
} else {
566+
this.serve(req, res);
567+
}
552568
} else {
553569
for (let i = 0; i < evs.length; i++) {
554570
evs[i].call(srv, req, res);

‎package-lock.json

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"dependencies": {
4949
"accepts": "~1.3.4",
5050
"base64id": "~2.0.0",
51+
"cors": "~2.8.5",
5152
"debug": "~4.3.2",
5253
"engine.io": "~6.5.0",
5354
"socket.io-adapter": "~2.5.2",

‎test/server-attachment.ts

+21
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,27 @@ describe("server attachment", () => {
7070
});
7171
});
7272

73+
it("should serve client with necessary CORS headers", (done) => {
74+
const srv = createServer();
75+
new Server(srv, {
76+
cors: {
77+
origin: "https://good-origin.com",
78+
},
79+
});
80+
request(srv)
81+
.get("/socket.io/socket.io.js")
82+
.set("origin", "https://good-origin.com")
83+
.buffer(true)
84+
.end((err, res) => {
85+
if (err) return done(err);
86+
expect(res.headers["access-control-allow-origin"]).to.be(
87+
"https://good-origin.com"
88+
);
89+
expect(res.status).to.be(200);
90+
done();
91+
});
92+
});
93+
7394
it(
7495
"should serve bundle with msgpack parser",
7596
testSource("socket.io.msgpack.min.js")

0 commit comments

Comments
 (0)
Please sign in to comment.