Files
proxy/apps/node/src/routes/proxy.ts

74 lines
2.2 KiB
TypeScript
Raw Normal View History

2023-11-14 17:56:44 +00:00
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) {
2023-11-16 11:56:52 +00:00
const before = Date.now();
2023-11-14 17:56:44 +00:00
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;
}
// TODO: handle rate limiting? and/or caching?
2023-11-16 14:03:04 +00:00
try {
const response = await axios.get(url, {
headers: {
"Content-Type": "application/json",
},
});
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"];
2023-11-16 15:10:06 +00:00
delete headers["access-control-expose-headers"];
delete headers["cross-origin-embedder-policy"];
delete headers["cross-origin-opener-policy"];
delete headers["cross-origin-resource-policy"];
2023-11-16 14:03:04 +00:00
// 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"];
// Add node specific headers
headers["x-proxy-node"] = process.env.NODE_ID;
headers["x-proxy-response-time"] = Date.now() - before + "ms";
// Return the JSON response
res.status(response.status).set(headers).json(data);
} catch (ex) {
res
.status(500)
.json(RouteMessages.internalServerError("Error fetching URL"));
}
2023-11-14 17:56:44 +00:00
}
}