Skip to content

Commit

Permalink
fix(node/http): add encrypted field to FakeSocket (denoland#19886)
Browse files Browse the repository at this point in the history
  • Loading branch information
crowlKats committed Jul 21, 2023
1 parent 5ff040b commit da70972
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 12 deletions.
8 changes: 6 additions & 2 deletions cli/tests/unit_node/http_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -637,7 +637,9 @@ Deno.test("[node/http] HTTPS server", async () => {
const server = https.createServer({
cert: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.crt"),
key: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.key"),
}, (_req, res) => {
}, (req, res) => {
// @ts-ignore: It exists on TLSSocket
assert(req.socket.encrypted);
res.end("success!");
});
server.listen(() => {
Expand All @@ -664,7 +666,9 @@ Deno.test(
{ permissions: { net: true } },
async () => {
const promise = deferred();
const server = http.createServer((_req, res) => {
const server = http.createServer((req, res) => {
// @ts-ignore: It exists on TLSSocket
assert(!req.socket.encrypted);
res.writeHead(200, { "Content-Type": "text/plain" });
res.end("okay");
});
Expand Down
26 changes: 16 additions & 10 deletions ext/node/polyfills/http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,7 @@ class FakeSocket extends EventEmitter {
super();
this.remoteAddress = opts.hostname;
this.remotePort = opts.port;
this.encrypted = opts.encrypted;
}

setKeepAlive() {}
Expand Down Expand Up @@ -561,7 +562,7 @@ class ClientRequest extends OutgoingMessage {
this.onSocket(createConnection(optsWithoutSignal));
}
}*/
this.onSocket(new FakeSocket());
this.onSocket(new FakeSocket({ encrypted: this._encrypted }));

const url = this._createUrlStrFromOptions();

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

constructor(resolve: (value: Response | PromiseLike<Response>) => void) {
constructor(
resolve: (value: Response | PromiseLike<Response>) => void,
socket: FakeSocket,
) {
let controller: ReadableByteStreamController;
const readable = new ReadableStream({
start(c) {
Expand Down Expand Up @@ -1349,7 +1353,7 @@ export class ServerResponse extends NodeWritable {
});
this.#readable = readable;
this.#resolve = resolve;
this.socket = new FakeSocket();
this.socket = socket;
}

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

constructor(req: Request, remoteAddr: { hostname: string; port: number }) {
constructor(req: Request, socket: FakeSocket) {
// Check if no body (GET/HEAD/OPTIONS/...)
const reader = req.body?.getReader();
super({
Expand All @@ -1465,10 +1469,7 @@ export class IncomingMessageForServer extends NodeReadable {
// url: (new URL(request.url).pathname),
this.url = req.url?.slice(req.url.indexOf("/", 8));
this.method = req.method;
this.socket = new FakeSocket({
remoteAddress: remoteAddr.hostname,
remotePort: remoteAddr.port,
});
this.socket = socket;
this.#req = req;
}

Expand Down Expand Up @@ -1572,7 +1573,12 @@ export class ServerImpl extends EventEmitter {
_serve() {
const ac = new AbortController();
const handler = (request: Request, info: Deno.ServeHandlerInfo) => {
const req = new IncomingMessageForServer(request, info.remoteAddr);
const socket = new FakeSocket({
remoteAddress: info.remoteAddr.hostname,
remotePort: info.remoteAddr.port,
encrypted: this._encrypted,
});
const req = new IncomingMessageForServer(request, socket);
if (req.upgrade && this.listenerCount("upgrade") > 0) {
const { conn, response } = upgradeHttpRaw(request);
const socket = new Socket({
Expand All @@ -1582,7 +1588,7 @@ export class ServerImpl extends EventEmitter {
return response;
} else {
return new Promise<Response>((resolve): void => {
const res = new ServerResponse(resolve);
const res = new ServerResponse(resolve, socket);
this.emit("request", req, res);
});
}
Expand Down
3 changes: 3 additions & 0 deletions ext/node/polyfills/https.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ export class Server extends HttpServer {
: this._opts.key,
};
}

_encrypted = true;
}
export function createServer(opts, requestListener?: ServerHandler) {
return new Server(opts, requestListener);
Expand Down Expand Up @@ -110,6 +112,7 @@ const globalAgent = new Agent({

/** HttpsClientRequest class loosely follows http.ClientRequest class API. */
class HttpsClientRequest extends ClientRequest {
override _encrypted: true;
override defaultProtocol = "https:";
override _getClient(): Deno.HttpClient | undefined {
if (caCerts === null) {
Expand Down

0 comments on commit da70972

Please sign in to comment.