summaryrefslogtreecommitdiff
path: root/cli/tests/unit_node/http_test.ts
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2023-06-13 14:11:27 +0200
committerGitHub <noreply@github.com>2023-06-13 14:11:27 +0200
commit07cbec4a822ea1b535511195217138d6e8b679ef (patch)
treece35b9aff3c6366eae4f630b1b3f73ae35a5ccdf /cli/tests/unit_node/http_test.ts
parent44bd59c05e11f0d7fb0e3a5a521274b2f9f2164b (diff)
fix(ext/node): handle 'upgrade' responses (#19412)
This commit adds support for "upgrade" events in "node:http" "ClientRequest". Currently only "Websocket" upgrades are handled. Thanks to this change package like "npm:puppeteer" and "npm:discord" should work. Closes https://github.com/denoland/deno/issues/18913 Closes https://github.com/denoland/deno/issues/17847
Diffstat (limited to 'cli/tests/unit_node/http_test.ts')
-rw-r--r--cli/tests/unit_node/http_test.ts50
1 files changed, 50 insertions, 0 deletions
diff --git a/cli/tests/unit_node/http_test.ts b/cli/tests/unit_node/http_test.ts
index 0d15bf889..4732781f8 100644
--- a/cli/tests/unit_node/http_test.ts
+++ b/cli/tests/unit_node/http_test.ts
@@ -649,3 +649,53 @@ Deno.test("[node/http] HTTPS server", async () => {
await Promise.all([promise, promise2]);
client.close();
});
+
+Deno.test(
+ "[node/http] client upgrade",
+ { permissions: { net: true } },
+ async () => {
+ const promise = deferred();
+ const server = http.createServer((_req, res) => {
+ res.writeHead(200, { "Content-Type": "text/plain" });
+ res.end("okay");
+ });
+ // @ts-ignore it's a socket for real
+ let serverSocket;
+ server.on("upgrade", (_req, socket, _head) => {
+ socket.write(
+ "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" +
+ "Upgrade: WebSocket\r\n" +
+ "Connection: Upgrade\r\n" +
+ "\r\n",
+ );
+ serverSocket = socket;
+ });
+
+ // Now that server is running
+ server.listen(1337, "127.0.0.1", () => {
+ // make a request
+ const options = {
+ port: 1337,
+ host: "127.0.0.1",
+ headers: {
+ "Connection": "Upgrade",
+ "Upgrade": "websocket",
+ },
+ };
+
+ const req = http.request(options);
+ req.end();
+
+ req.on("upgrade", (_res, socket, _upgradeHead) => {
+ socket.end();
+ // @ts-ignore it's a socket for real
+ serverSocket!.end();
+ server.close(() => {
+ promise.resolve();
+ });
+ });
+ });
+
+ await promise;
+ },
+);