Skip to content

Commit da70972

Browse files
authored
fix(node/http): add encrypted field to FakeSocket (#19886)
Fixes #19557
1 parent 5ff040b commit da70972

File tree

3 files changed

+25
-12
lines changed

3 files changed

+25
-12
lines changed

cli/tests/unit_node/http_test.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,9 @@ Deno.test("[node/http] HTTPS server", async () => {
637637
const server = https.createServer({
638638
cert: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.crt"),
639639
key: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.key"),
640-
}, (_req, res) => {
640+
}, (req, res) => {
641+
// @ts-ignore: It exists on TLSSocket
642+
assert(req.socket.encrypted);
641643
res.end("success!");
642644
});
643645
server.listen(() => {
@@ -664,7 +666,9 @@ Deno.test(
664666
{ permissions: { net: true } },
665667
async () => {
666668
const promise = deferred();
667-
const server = http.createServer((_req, res) => {
669+
const server = http.createServer((req, res) => {
670+
// @ts-ignore: It exists on TLSSocket
671+
assert(!req.socket.encrypted);
668672
res.writeHead(200, { "Content-Type": "text/plain" });
669673
res.end("okay");
670674
});

ext/node/polyfills/http.ts

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ class FakeSocket extends EventEmitter {
278278
super();
279279
this.remoteAddress = opts.hostname;
280280
this.remotePort = opts.port;
281+
this.encrypted = opts.encrypted;
281282
}
282283

283284
setKeepAlive() {}
@@ -561,7 +562,7 @@ class ClientRequest extends OutgoingMessage {
561562
this.onSocket(createConnection(optsWithoutSignal));
562563
}
563564
}*/
564-
this.onSocket(new FakeSocket());
565+
this.onSocket(new FakeSocket({ encrypted: this._encrypted }));
565566

566567
const url = this._createUrlStrFromOptions();
567568

@@ -1306,7 +1307,10 @@ export class ServerResponse extends NodeWritable {
13061307
return status === 101 || status === 204 || status === 205 || status === 304;
13071308
}
13081309

1309-
constructor(resolve: (value: Response | PromiseLike<Response>) => void) {
1310+
constructor(
1311+
resolve: (value: Response | PromiseLike<Response>) => void,
1312+
socket: FakeSocket,
1313+
) {
13101314
let controller: ReadableByteStreamController;
13111315
const readable = new ReadableStream({
13121316
start(c) {
@@ -1349,7 +1353,7 @@ export class ServerResponse extends NodeWritable {
13491353
});
13501354
this.#readable = readable;
13511355
this.#resolve = resolve;
1352-
this.socket = new FakeSocket();
1356+
this.socket = socket;
13531357
}
13541358

13551359
setHeader(name: string, value: string) {
@@ -1438,7 +1442,7 @@ export class IncomingMessageForServer extends NodeReadable {
14381442
// These properties are used by `npm:forwarded` for example.
14391443
socket: { remoteAddress: string; remotePort: number };
14401444

1441-
constructor(req: Request, remoteAddr: { hostname: string; port: number }) {
1445+
constructor(req: Request, socket: FakeSocket) {
14421446
// Check if no body (GET/HEAD/OPTIONS/...)
14431447
const reader = req.body?.getReader();
14441448
super({
@@ -1465,10 +1469,7 @@ export class IncomingMessageForServer extends NodeReadable {
14651469
// url: (new URL(request.url).pathname),
14661470
this.url = req.url?.slice(req.url.indexOf("/", 8));
14671471
this.method = req.method;
1468-
this.socket = new FakeSocket({
1469-
remoteAddress: remoteAddr.hostname,
1470-
remotePort: remoteAddr.port,
1471-
});
1472+
this.socket = socket;
14721473
this.#req = req;
14731474
}
14741475

@@ -1572,7 +1573,12 @@ export class ServerImpl extends EventEmitter {
15721573
_serve() {
15731574
const ac = new AbortController();
15741575
const handler = (request: Request, info: Deno.ServeHandlerInfo) => {
1575-
const req = new IncomingMessageForServer(request, info.remoteAddr);
1576+
const socket = new FakeSocket({
1577+
remoteAddress: info.remoteAddr.hostname,
1578+
remotePort: info.remoteAddr.port,
1579+
encrypted: this._encrypted,
1580+
});
1581+
const req = new IncomingMessageForServer(request, socket);
15761582
if (req.upgrade && this.listenerCount("upgrade") > 0) {
15771583
const { conn, response } = upgradeHttpRaw(request);
15781584
const socket = new Socket({
@@ -1582,7 +1588,7 @@ export class ServerImpl extends EventEmitter {
15821588
return response;
15831589
} else {
15841590
return new Promise<Response>((resolve): void => {
1585-
const res = new ServerResponse(resolve);
1591+
const res = new ServerResponse(resolve, socket);
15861592
this.emit("request", req, res);
15871593
});
15881594
}

ext/node/polyfills/https.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ export class Server extends HttpServer {
5050
: this._opts.key,
5151
};
5252
}
53+
54+
_encrypted = true;
5355
}
5456
export function createServer(opts, requestListener?: ServerHandler) {
5557
return new Server(opts, requestListener);
@@ -110,6 +112,7 @@ const globalAgent = new Agent({
110112

111113
/** HttpsClientRequest class loosely follows http.ClientRequest class API. */
112114
class HttpsClientRequest extends ClientRequest {
115+
override _encrypted: true;
113116
override defaultProtocol = "https:";
114117
override _getClient(): Deno.HttpClient | undefined {
115118
if (caCerts === null) {

0 commit comments

Comments
 (0)