mirror of
https://github.com/denoland/deno.git
synced 2024-11-27 16:10:57 -05:00
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.
This commit is contained in:
parent
167f674c7c
commit
a61ba3c699
4 changed files with 26 additions and 5 deletions
|
@ -76,7 +76,11 @@ import {
|
||||||
ReadableStreamPrototype,
|
ReadableStreamPrototype,
|
||||||
resourceForReadableStream,
|
resourceForReadableStream,
|
||||||
} from "ext:deno_web/06_streams.js";
|
} 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 { hasTlsKeyPairOptions, listenTls } from "ext:deno_net/02_tls.js";
|
||||||
import { SymbolAsyncDispose } from "ext:deno_web/00_infra.js";
|
import { SymbolAsyncDispose } from "ext:deno_web/00_infra.js";
|
||||||
|
|
||||||
|
@ -189,7 +193,7 @@ class InnerRequest {
|
||||||
|
|
||||||
const upgradeRid = op_http_upgrade_raw(external);
|
const upgradeRid = op_http_upgrade_raw(external);
|
||||||
|
|
||||||
const conn = new TcpConn(
|
const conn = new UpgradedConn(
|
||||||
upgradeRid,
|
upgradeRid,
|
||||||
underlyingConn?.remoteAddr,
|
underlyingConn?.remoteAddr,
|
||||||
underlyingConn?.localAddr,
|
underlyingConn?.localAddr,
|
||||||
|
|
|
@ -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 {
|
class TcpConn extends Conn {
|
||||||
#rid = 0;
|
#rid = 0;
|
||||||
|
|
||||||
|
@ -601,5 +615,6 @@ export {
|
||||||
resolveDns,
|
resolveDns,
|
||||||
TcpConn,
|
TcpConn,
|
||||||
UnixConn,
|
UnixConn,
|
||||||
|
UpgradedConn,
|
||||||
validatePort,
|
validatePort,
|
||||||
};
|
};
|
||||||
|
|
|
@ -67,7 +67,7 @@ import { headersEntries } from "ext:deno_fetch/20_headers.js";
|
||||||
import { timerId } from "ext:deno_web/03_abort_signal.js";
|
import { timerId } from "ext:deno_web/03_abort_signal.js";
|
||||||
import { clearTimeout as webClearTimeout } from "ext:deno_web/02_timers.js";
|
import { clearTimeout as webClearTimeout } from "ext:deno_web/02_timers.js";
|
||||||
import { resourceForReadableStream } from "ext:deno_web/06_streams.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 { STATUS_CODES } from "node:_http_server";
|
||||||
import { methods as METHODS } from "node:_http_common";
|
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");
|
||||||
assert(typeof res.remoteAddrIp !== "undefined");
|
assert(typeof res.remoteAddrIp !== "undefined");
|
||||||
const conn = new TcpConn(
|
const conn = new UpgradedConn(
|
||||||
upgradeRid,
|
upgradeRid,
|
||||||
{
|
{
|
||||||
transport: "tcp",
|
transport: "tcp",
|
||||||
|
|
|
@ -300,7 +300,9 @@ export class TCP extends ConnectionWrap {
|
||||||
* @return An error status code.
|
* @return An error status code.
|
||||||
*/
|
*/
|
||||||
setNoDelay(noDelay: boolean): number {
|
setNoDelay(noDelay: boolean): number {
|
||||||
this[kStreamBaseField].setNoDelay(noDelay);
|
if ("setNoDelay" in this[kStreamBaseField]) {
|
||||||
|
this[kStreamBaseField].setNoDelay(noDelay);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue