kaven-utils
Version:
Utils for Node.js.
78 lines (77 loc) • 2.7 kB
JavaScript
/********************************************************************
* @author: Kaven
* @email: kaven@wuwenkai.com
* @website: http://blog.kaven.xyz
* @file: [Kaven-Utils] /src/net/proxy/HttpsProxyServer.ts
* @create: 2022-04-15 15:35:05.480
* @modify: 2025-10-14 22:58:04.856
* @version: 6.1.0
* @times: 36
* @lines: 100
* @copyright: Copyright © 2022-2025 Kaven. All Rights Reserved.
* @description: [description]
* @license: [license]
********************************************************************/
import { createServer } from "node:https";
import { connect } from "node:net";
import { KavenUrl } from "kaven-basic";
import { AbstractProxyServer } from "./AbstractProxyServer.js";
export class HttpsProxyServer extends AbstractProxyServer {
server;
constructor(options) {
super();
this.server = createServer(options);
}
async handleHttpRequest(client, req) {
if (req.IsHttpConnect) {
return;
}
await super.handleHttpRequest(client, req);
}
Initialize() {
this.server.on("secureConnection", (userSocket) => {
this.onSocketConnected(userSocket);
});
this.server.on("clientError", (err) => {
this.Logger?.Warn(err);
});
this.server.on("connect", (req, userSocket) => {
if (req.url === undefined) {
userSocket.end();
return;
}
const u = new KavenUrl(req.url);
const proxySocket = connect(u.Port ?? 443, u.DomainName, function () {
userSocket.write("HTTP/1.1 200 Connection Established\r\n\r\n");
proxySocket.pipe(userSocket);
userSocket.pipe(proxySocket);
});
userSocket.on("error", (err) => {
this.Error(`Client to proxy error: ${err}`);
}).once("close", () => {
proxySocket.destroy();
});
proxySocket.on("error", (err) => {
this.Error(`Proxy to server error: ${err}`);
}).once("close", () => {
userSocket.destroy();
});
});
this.server.on("error", (err) => {
this.Log("Some internal server error occurred");
this.Error(err);
});
this.server.on("close", () => {
this.Log("Client disconnected");
});
}
Start(port = 8765) {
this.Initialize();
this.server.listen({
host: "0.0.0.0",
port,
}, () => {
this.Log(`Server listening on 0.0.0.0:${port}`);
});
}
}