Skip to content

Commit bc938fa

Browse files
committed
Feeling smug
1 parent b7f79dd commit bc938fa

File tree

3 files changed

+155
-2
lines changed

3 files changed

+155
-2
lines changed

package-lock.json

Lines changed: 91 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"name": "pyrox",
3+
"version": "1.0.0",
4+
"description": "Proxy that runs on [Cloudflare Workers](https://workers.dev).",
5+
"repository": {
6+
"type": "git",
7+
"url": "git+https://github.com/bots-gg/pyrox.git"
8+
},
9+
"author": "A5rocks",
10+
"license": "ISC",
11+
"bugs": {
12+
"url": "https://github.com/bots-gg/pyrox/issues"
13+
},
14+
"homepage": "https://github.com/bots-gg/pyrox#readme",
15+
"devDependencies": {
16+
"@cloudflare/workers-types": "^4.20230511.0"
17+
},
18+
"dependencies": {
19+
"@bots-gg/markup": "^1.3.1"
20+
}
21+
}

src/index.ts

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { escapeCSS } from "@bots-gg/markup";
2+
13
const parseHex = (hex: string) => {
24
const buf = new ArrayBuffer(hex.length / 2);
35
const bufView = new Uint8Array(buf);
@@ -24,6 +26,11 @@ const parseB64 = (b64: string) => {
2426
return buf;
2527
}
2628

29+
const getMimeType = (contentType: string | undefined) =>
30+
contentType?.includes(";")
31+
? contentType.split(";")[0].trim()
32+
: contentType?.trim();
33+
2734
export default {
2835
async fetch(request: Request, { PUBLIC_KEY }: { PUBLIC_KEY: string }): Promise<Response> {
2936
const userAgent = request.headers.get('User-Agent');
@@ -68,8 +75,42 @@ export default {
6875
const requestedUrl = new URL(subUrl, url.origin);
6976

7077
const resp = await fetch(requestedUrl.toString(), { headers: new Headers({ 'User-Agent': userAgent }) });
71-
const newResp = new Response(resp.body, resp); // ??
72-
newResp.headers.set("Content-Security-Policy", "default-src: 'self';")
78+
79+
let body: Response['body'] | string = resp.body;
80+
console.log({"content-type": resp.headers.get("Content-Type")?.toLowerCase()});
81+
if (getMimeType(resp.headers.get("Content-Type")?.toLowerCase()) === "text/css") {
82+
// this sucks...
83+
const text = await resp.text();
84+
const urls: string[] = [];
85+
escapeCSS(text, (url: string) => {
86+
urls.push(url);
87+
return url;
88+
});
89+
90+
let giveUp = false;
91+
const responses = await Promise.all(urls.map(async (url) => {
92+
const otherResp = await fetch((new URL(url, request.url)));
93+
const mimeType = getMimeType(otherResp.headers.get("Content-Type")?.toLowerCase());
94+
if (mimeType === "text/css") {
95+
giveUp = true;
96+
}
97+
// *smug smirk*
98+
return `data:${mimeType};base64,${btoa(await otherResp.text())}`;
99+
}));
100+
101+
if (giveUp) {
102+
return new Response("You suck.");
103+
}
104+
105+
const urlMap = Object.fromEntries(urls.map((url, i) => [url, i]));
106+
107+
body = escapeCSS(text, (url: string) => responses[urlMap[url]]);
108+
}
109+
110+
const newResp = new Response(body, resp); // :(
111+
newResp.headers.set("Content-Security-Policy", "default-src: 'self';");
112+
newResp.headers.set("X-Content-Type-Options", "nosniff");
113+
73114
return newResp;
74115
}
75116
};

0 commit comments

Comments
 (0)