Skip to content

Commit

Permalink
save
Browse files Browse the repository at this point in the history
  • Loading branch information
schettn committed Jun 28, 2024
1 parent 3f621aa commit b6c6f34
Showing 1 changed file with 52 additions and 120 deletions.
172 changes: 52 additions & 120 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { Context, PylonAPI, auth, defineService } from "@getcronit/pylon";
import { Handler } from "hono";
import https from "https";
import http from "http";
import { createBunWebSocket } from "hono/bun";
import { WebSocket } from "ws";

Expand Down Expand Up @@ -35,8 +33,6 @@ function basicProxy(proxy_url = ""): Handler {
}
// request

console.log("Request", c.req.raw.method, url, c.req.raw.headers.values());

const headers = {};

c.req.raw.headers.forEach((value, key) => {
Expand All @@ -60,55 +56,19 @@ function basicProxy(proxy_url = ""): Handler {
headers[key] = value;
});

console.log("IP", c.req.raw);

// const serviceUrl = new URL(url);

// headers["host"] = serviceUrl.host;
// headers["origin"] = serviceUrl.origin;
// headers["referer"] = c.req
// .header("referer")
// ?.replace(new URL(c.req.url).host, serviceUrl.host);

console.log("Headers", headers);

const blob = await c.req.blob();

// const testResWithoutHeaders = await fetch(url, {
// method: c.req.raw.method,
// body: blob.size > 0 ? blob : undefined,
// });

// Send head request to test if the request is successful

const res = await fetch(url, {
method: "HEAD",
});

console.log("HEAD Response", res.status, res.statusText);

// console.log(
// "TEST Response without headers",
// testResWithoutHeaders.status,
// testResWithoutHeaders.statusText
// );

const fetchAndHandleBunCertificateError = async (): Promise<Response> => {
try {
console.log(
"fetchAndHandleBunCertificateError: Fetching",
url,
headers
);
console.log("fetchAndHandleBunCertificateError: Fetching", url);
return await fetch(url, {
method: c.req.raw.method,
headers: { ...headers },
headers: { ...headers, host: undefined },
body: blob.size > 0 ? blob : undefined,
tls: {
rejectUnauthorized: false,
},
keepalive: false,
verbose: true,
});
} catch (error) {
console.error(
Expand Down Expand Up @@ -164,6 +124,8 @@ function basicProxy(proxy_url = ""): Handler {

// Delete x-frame-options header
response.headers.delete("x-frame-options");
// Delete CSP header
response.headers.delete("content-security-policy");

return new Response(compressed, {
status: response.status,
Expand All @@ -173,41 +135,6 @@ function basicProxy(proxy_url = ""): Handler {
} catch (error) {
console.error("Error", error);

// // I know that the request passes without headers
// // So I will add one by one and see which one is causing the issue

// const partialHeaders = {};

// for (const [key, value] of Object.entries(headers)) {
// partialHeaders[key] = value;

// console.log("Trying headers", partialHeaders);

// try {
// const response = await fetch(url, {
// method: c.req.raw.method,
// headers: partialHeaders,
// body: blob.size > 0 ? blob : undefined,
// });

// console.log("TESTING Response", response.status, response.statusText);
// } catch (error) {
// console.error("Error", error);
// }
// }

// console.log("TRYING HEADERS DONE");

// // Test the normal call again to see how fucked this is

// // const response = await fetch(url, {
// // method: c.req.raw.method,
// // headers: headers,
// // body: blob.size > 0 ? blob : undefined,
// // });

// // console.log("FINAL", response.status);

return new Response("Error", {
status: 500,
});
Expand All @@ -217,7 +144,6 @@ function basicProxy(proxy_url = ""): Handler {

import { Lens, LensService } from "./services/lens.service";
import { PasswordUpdater } from "./services/password-updater.service";
import axios from "axios";

dotenv.config();

Expand Down Expand Up @@ -247,75 +173,81 @@ export const configureApp: PylonAPI["configureApp"] = async (app) => {
});

app.use(
upgradeWebSocket((c) => {
console.log("WebSocket connection");

let targetWs: WebSocket;
upgradeWebSocket(async (c) => {
// Skip if not a WebSocket upgrade request
if (!c.req.header("upgrade") || c.req.header("upgrade") !== "websocket") {
return {};
}

return {
onOpen: (e, ws) => {
console.log("Opening WebSocket connection");
const subdomains = getSubdomains(c.req.url);
const serviceId = subdomains[subdomains.length - 1] || "";

const subdomains = getSubdomains(c.req.url);
const service = services.get(serviceId);

const serviceId = subdomains[subdomains.length - 1] || "";
if (service === undefined) {
throw new Error("Service not found");
}

const service = services.get(serviceId);
const url = new URL(c.req.url);
url.host = service.host;
url.port = service.port.toString();
url.protocol = service.isSecure ? "wss:" : "ws:";

if (service === undefined) {
return ws.close(4001, "Service not found");
}
console.log("Connecting to", url.href);

const url = new URL(c.req.url);
const wsOrigin = `${service.isSecure ? "https" : "http"}://${
service.host
}:${service.port}`;

// Change the host
url.host = service.host;
// Change the port
url.port = service.port.toString();
// Change the protocol
url.protocol = service.isSecure ? "wss:" : "ws:";
const targetWs = new WebSocket(url.href, {
headers: {
cookie: c.req.header("cookie"),
origin: wsOrigin,
},
});

console.log("Connecting to", url);
await new Promise<void>((resolve) => {
// Wait until targetWs is open
targetWs.onopen = () => {
console.log("Target WebSocket connection established");

targetWs = new WebSocket(url, {
rejectUnauthorized: false,
headers: {
...c.req.raw.headers,
},
});
resolve();
};
});

targetWs.onopen = (e) => {
console.log("Target WebSocket connection established");
};
return {
onOpen: (e, ws) => {
console.log("Opening WebSocket connection");

targetWs.onerror = (event) => {
console.log("Target WebSocket error", event);

throw new Error(event.error);
console.error("Target WebSocket error:", event.message || event);
ws.close(1011, "Target WebSocket error");
};

targetWs.onmessage = (event) => {
console.log("Message received", event.data);
targetWs.onmessage = async (event) => {
console.log("Target WebSocket message received", event.data);

ws.send(event.data.toString());
};

targetWs.onclose = (e) => {
// log why the connection was closed
console.log("Target WebSocket connection closed", e.code, e.reason);

ws.close(e.code, e.reason);
};
},
onMessage: (event, ws) => {
console.log("Message received", event.data);

targetWs.send(event.data.toString());
console.log("Message received", event.data.toString());
if (targetWs) {
targetWs.send(event.data.toString());
} else {
console.error("No target WebSocket to forward message to");
}
},
onClose: (e) => {
console.log("Closing WebSocket connection", e.code, e.reason);

targetWs.close();
if (targetWs) {
targetWs.close(e.code, e.reason);
}
},
};
})
Expand Down

0 comments on commit b6c6f34

Please sign in to comment.