UNPKG

kaven-utils

Version:

Utils for Node.js.

79 lines (78 loc) 2.77 kB
/******************************************************************** * @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: 2024-11-01 10:48:07.311 * @version: 5.4.5 * @times: 32 * @lines: 101 * @copyright: Copyright © 2022-2024 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"; import { InternalLogger } from "../../KavenUtility.Internal.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) => { InternalLogger()?.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}`); }); } }