summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Whitaker <17734409+nathanwhit@users.noreply.github.com>2024-10-16 20:56:57 -0700
committerGitHub <noreply@github.com>2024-10-17 03:56:57 +0000
commita61ba3c6995bef58f508a34e537932284692c294 (patch)
tree75e3e3dbba7b648ef6787da8e1f4989286d4583d
parent167f674c7cbb9632000c1feb0b747ba098b01c12 (diff)
fix(net): don't try to set nodelay on upgrade streams (#26342)
Fixes https://github.com/denoland/deno/issues/26341. We try to call `op_set_nodelay` on an `UpgradeStream`, which doesn't support that operation.
-rw-r--r--ext/http/00_serve.ts8
-rw-r--r--ext/net/01_net.js15
-rw-r--r--ext/node/polyfills/http.ts4
-rw-r--r--ext/node/polyfills/internal_binding/tcp_wrap.ts4
4 files changed, 26 insertions, 5 deletions
diff --git a/ext/http/00_serve.ts b/ext/http/00_serve.ts
index 3b9b085a2..1b70cf212 100644
--- a/ext/http/00_serve.ts
+++ b/ext/http/00_serve.ts
@@ -76,7 +76,11 @@ import {
ReadableStreamPrototype,
resourceForReadableStream,
} from "ext:deno_web/06_streams.js";
-import { listen, listenOptionApiName, TcpConn } from "ext:deno_net/01_net.js";
+import {
+ listen,
+ listenOptionApiName,
+ UpgradedConn,
+} from "ext:deno_net/01_net.js";
import { hasTlsKeyPairOptions, listenTls } from "ext:deno_net/02_tls.js";
import { SymbolAsyncDispose } from "ext:deno_web/00_infra.js";
@@ -189,7 +193,7 @@ class InnerRequest {
const upgradeRid = op_http_upgrade_raw(external);
- const conn = new TcpConn(
+ const conn = new UpgradedConn(
upgradeRid,
underlyingConn?.remoteAddr,
underlyingConn?.localAddr,
diff --git a/ext/net/01_net.js b/ext/net/01_net.js
index 5b894947e..c3e5f9e5c 100644
--- a/ext/net/01_net.js
+++ b/ext/net/01_net.js
@@ -194,6 +194,20 @@ class Conn {
}
}
+class UpgradedConn extends Conn {
+ #rid = 0;
+
+ constructor(rid, remoteAddr, localAddr) {
+ super(rid, remoteAddr, localAddr);
+ ObjectDefineProperty(this, internalRidSymbol, {
+ __proto__: null,
+ enumerable: false,
+ value: rid,
+ });
+ this.#rid = rid;
+ }
+}
+
class TcpConn extends Conn {
#rid = 0;
@@ -601,5 +615,6 @@ export {
resolveDns,
TcpConn,
UnixConn,
+ UpgradedConn,
validatePort,
};
diff --git a/ext/node/polyfills/http.ts b/ext/node/polyfills/http.ts
index e117a0ec2..20bef3009 100644
--- a/ext/node/polyfills/http.ts
+++ b/ext/node/polyfills/http.ts
@@ -67,7 +67,7 @@ import { headersEntries } from "ext:deno_fetch/20_headers.js";
import { timerId } from "ext:deno_web/03_abort_signal.js";
import { clearTimeout as webClearTimeout } from "ext:deno_web/02_timers.js";
import { resourceForReadableStream } from "ext:deno_web/06_streams.js";
-import { TcpConn } from "ext:deno_net/01_net.js";
+import { UpgradedConn } from "ext:deno_net/01_net.js";
import { STATUS_CODES } from "node:_http_server";
import { methods as METHODS } from "node:_http_common";
@@ -517,7 +517,7 @@ class ClientRequest extends OutgoingMessage {
);
assert(typeof res.remoteAddrIp !== "undefined");
assert(typeof res.remoteAddrIp !== "undefined");
- const conn = new TcpConn(
+ const conn = new UpgradedConn(
upgradeRid,
{
transport: "tcp",
diff --git a/ext/node/polyfills/internal_binding/tcp_wrap.ts b/ext/node/polyfills/internal_binding/tcp_wrap.ts
index 1321cc627..2856f808a 100644
--- a/ext/node/polyfills/internal_binding/tcp_wrap.ts
+++ b/ext/node/polyfills/internal_binding/tcp_wrap.ts
@@ -300,7 +300,9 @@ export class TCP extends ConnectionWrap {
* @return An error status code.
*/
setNoDelay(noDelay: boolean): number {
- this[kStreamBaseField].setNoDelay(noDelay);
+ if ("setNoDelay" in this[kStreamBaseField]) {
+ this[kStreamBaseField].setNoDelay(noDelay);
+ }
return 0;
}