All checks were successful
Publish Docker Images / docker (push) Successful in 1m56s
76 lines
2.3 KiB
TypeScript
76 lines
2.3 KiB
TypeScript
import axios from "axios";
|
|
import { Request, Response } from "express";
|
|
import { Route, RouteMessages } from "server";
|
|
import { PROXY_SECRET } from "../secrets";
|
|
|
|
export default class ProxyRoute extends Route {
|
|
constructor() {
|
|
super({ path: "/proxy" });
|
|
}
|
|
|
|
async handle(req: Request, res: Response) {
|
|
const before = Date.now();
|
|
const json = req.body;
|
|
const secret = json.secret;
|
|
if (!secret) {
|
|
res.status(401).json(RouteMessages.badRequest("No secret provided"));
|
|
return;
|
|
}
|
|
if (secret !== PROXY_SECRET) {
|
|
res.status(401).json(RouteMessages.badRequest("Invalid secret"));
|
|
return;
|
|
}
|
|
|
|
const url = json.url;
|
|
if (!url) {
|
|
res.status(400).json(RouteMessages.badRequest("No URL provided"));
|
|
return;
|
|
}
|
|
try {
|
|
const response = await axios.get(url);
|
|
const data = response.data;
|
|
const headers = response.headers;
|
|
|
|
// Is delete the best way to do this??
|
|
// Remove CORS headers
|
|
delete headers["access-control-allow-origin"];
|
|
delete headers["access-control-allow-credentials"];
|
|
delete headers["access-control-allow-headers"];
|
|
delete headers["access-control-allow-methods"];
|
|
delete headers["access-control-expose-headers"];
|
|
delete headers["cross-origin-embedder-policy"];
|
|
delete headers["cross-origin-opener-policy"];
|
|
delete headers["cross-origin-resource-policy"];
|
|
|
|
// Cloudflare headers
|
|
delete headers["server"];
|
|
delete headers["nel"];
|
|
delete headers["report-to"];
|
|
delete headers["cf-cache-status"];
|
|
delete headers["cf-ray"];
|
|
delete headers["alt-svc"];
|
|
|
|
// Misc headers
|
|
delete headers["transfer-encoding"];
|
|
delete headers["content-security-policy"];
|
|
delete headers["strict-transport-security"];
|
|
delete headers["referrer-policy"];
|
|
|
|
// Add node specific headers
|
|
headers["x-proxy-node"] = process.env.NODE_ID;
|
|
headers["x-proxy-response-time"] = Date.now() - before + "ms";
|
|
|
|
// Add CORS headers
|
|
headers["access-control-allow-origin"] = "*";
|
|
headers["access-control-allow-methods"] = "*";
|
|
|
|
// Return the JSON response
|
|
res.status(response.status).set(headers).send(data);
|
|
} catch (ex) {
|
|
res
|
|
.status(500)
|
|
.json(RouteMessages.internalServerError("Error fetching URL"));
|
|
}
|
|
}
|
|
}
|