kaven-utils
Version:
Utils for Node.js.
79 lines (78 loc) • 2.77 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: 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}`);
});
}
}