Skip to content

Commit a61ba3c

Browse files
authored
fix(net): don't try to set nodelay on upgrade streams (denoland#26342)
Fixes denoland#26341. We try to call `op_set_nodelay` on an `UpgradeStream`, which doesn't support that operation.
1 parent 167f674 commit a61ba3c

File tree

4 files changed

+26
-5
lines changed

4 files changed

+26
-5
lines changed

ext/http/00_serve.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,11 @@ import {
7676
ReadableStreamPrototype,
7777
resourceForReadableStream,
7878
} from "ext:deno_web/06_streams.js";
79-
import { listen, listenOptionApiName, TcpConn } from "ext:deno_net/01_net.js";
79+
import {
80+
listen,
81+
listenOptionApiName,
82+
UpgradedConn,
83+
} from "ext:deno_net/01_net.js";
8084
import { hasTlsKeyPairOptions, listenTls } from "ext:deno_net/02_tls.js";
8185
import { SymbolAsyncDispose } from "ext:deno_web/00_infra.js";
8286

@@ -189,7 +193,7 @@ class InnerRequest {
189193

190194
const upgradeRid = op_http_upgrade_raw(external);
191195

192-
const conn = new TcpConn(
196+
const conn = new UpgradedConn(
193197
upgradeRid,
194198
underlyingConn?.remoteAddr,
195199
underlyingConn?.localAddr,

ext/net/01_net.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,20 @@ class Conn {
194194
}
195195
}
196196

197+
class UpgradedConn extends Conn {
198+
#rid = 0;
199+
200+
constructor(rid, remoteAddr, localAddr) {
201+
super(rid, remoteAddr, localAddr);
202+
ObjectDefineProperty(this, internalRidSymbol, {
203+
__proto__: null,
204+
enumerable: false,
205+
value: rid,
206+
});
207+
this.#rid = rid;
208+
}
209+
}
210+
197211
class TcpConn extends Conn {
198212
#rid = 0;
199213

@@ -601,5 +615,6 @@ export {
601615
resolveDns,
602616
TcpConn,
603617
UnixConn,
618+
UpgradedConn,
604619
validatePort,
605620
};

ext/node/polyfills/http.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import { headersEntries } from "ext:deno_fetch/20_headers.js";
6767
import { timerId } from "ext:deno_web/03_abort_signal.js";
6868
import { clearTimeout as webClearTimeout } from "ext:deno_web/02_timers.js";
6969
import { resourceForReadableStream } from "ext:deno_web/06_streams.js";
70-
import { TcpConn } from "ext:deno_net/01_net.js";
70+
import { UpgradedConn } from "ext:deno_net/01_net.js";
7171
import { STATUS_CODES } from "node:_http_server";
7272
import { methods as METHODS } from "node:_http_common";
7373

@@ -517,7 +517,7 @@ class ClientRequest extends OutgoingMessage {
517517
);
518518
assert(typeof res.remoteAddrIp !== "undefined");
519519
assert(typeof res.remoteAddrIp !== "undefined");
520-
const conn = new TcpConn(
520+
const conn = new UpgradedConn(
521521
upgradeRid,
522522
{
523523
transport: "tcp",

ext/node/polyfills/internal_binding/tcp_wrap.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,9 @@ export class TCP extends ConnectionWrap {
300300
* @return An error status code.
301301
*/
302302
setNoDelay(noDelay: boolean): number {
303-
this[kStreamBaseField].setNoDelay(noDelay);
303+
if ("setNoDelay" in this[kStreamBaseField]) {
304+
this[kStreamBaseField].setNoDelay(noDelay);
305+
}
304306
return 0;
305307
}
306308

0 commit comments

Comments
 (0)