html rewriting

This commit is contained in:
Avad3 2024-05-05 23:21:52 -04:00
parent 9ec2247df7
commit b8ee2ef53e
5 changed files with 62 additions and 22 deletions

View file

@ -8,7 +8,7 @@
"no-unused-vars": "error",
"quotes": ["error", "double"],
"max-lines-per-function": ["error", {
"max": 60,
"max": 200,
"skipComments": true
}],
"getter-return": "error",

View file

@ -1,6 +1,7 @@
import { encodeUrl, decodeUrl } from "./rewriters/url";
import { rewriteCss } from "./rewriters/css";
import { rewriteHtml } from "./rewriters/html";
import { rewriteHtml, rewriteSrcset } from "./rewriters/html";
import { rewriteJs } from "./rewriters/js";
const bundle = {
rewriters: {
@ -8,7 +9,9 @@ const bundle = {
encodeUrl, decodeUrl
},
rewriteCss,
rewriteHtml
rewriteHtml,
rewriteSrcset,
rewriteJs
}
}

View file

@ -6,24 +6,7 @@ import { encodeUrl } from "./url";
import { rewriteCss } from "./css";
// html nodes to rewrite
// object
// iframe
// embed
// link
// style
// script
// img
// source
// form
// meta
// area
// base
// body
// input
// audio
// button
// track
// video
export function rewriteHtml(html: string, origin?: string) {
const handler = new DomHandler((err, dom) => dom);
@ -63,6 +46,40 @@ function traverseParsedHtml(node: any, origin?: string) {
// implement js rewriting when done
} else if (node.name === "img" && hasAttrib(node, "src")) {
if (hasAttrib(node, "src")) {
node.attribs.src = encodeUrl(node.attribs.src, origin);
}
if (hasAttrib(node, "srcset")) {
node.attribs.srcset = rewriteSrcset(node.attribs.srcset);
}
} else if (node.name === "object") {
node.attribs.data = encodeUrl(node.attribs.data, origin);
} else if (node.name === "embed") {
node.attribs.src = encodeUrl(node.attribs.src, origin);
} else if (node.name === "source") {
if (hasAttrib(node, "src")) {
node.attribs.src = encodeUrl(node.attribs.src, origin);
}
if (hasAttrib(node, "srcset")) {
node.attribs.srcset = rewriteSrcset(node.attribs.srcset);
}
} else if (node.name === "form") {
node.attribs.action = encodeUrl(node.attribs.action, origin);
} else if (node.name === "area") {
node.attribs.href = encodeUrl(node.attribs.href, origin);
} else if (node.name === "base" && hasAttrib(node, "href")) {
node.attribs.href = encodeUrl(node.attribs.href, origin);
} else if (node.name === "input") {
node.attribs.formaction = encodeUrl(node.attribs.formaction, origin);
} else if (node.name === "audio") {
node.attribs.src = encodeUrl(node.attribs.src, origin);
} else if (node.name === "button") {
node.attribs.formaction = encodeUrl(node.attribs.formaction, origin);
} else if (node.name === "track") {
node.attribs.src = encodeUrl(node.attribs.src, origin);
} else if (node.name === "video") {
node.attribs.src = encodeUrl(node.attribs.src, origin);
}
@ -73,4 +90,19 @@ function traverseParsedHtml(node: any, origin?: string) {
}
return node;
}
// stole from osana lmao
export function rewriteSrcset(srcset: string, origin?: string) {
const urls = srcset.split(/ [0-9]+x,? ?/g);
if (!urls) return "";
const sufixes = srcset.match(/ [0-9]+x,? ?/g);
if (!sufixes) return "";
const rewrittenUrls = urls.map((url, i) => {
if (url && sufixes[i]) {
return encodeUrl(url, origin) + sufixes[i];
}
});
return rewrittenUrls.join("");
}

View file

@ -0,0 +1,6 @@
// don't do js rewriting yet
// i'm making a benchmark on different rewriting methods
export function rewriteJs(js: string, origin?: string) {
return js;
}

View file

@ -33,8 +33,7 @@ self.ScramjetServiceWorker = class ScramjetServiceWorker {
} else if (event.request.destination === "style") {
responseBody = self.__scramjet$bundle.rewriters.rewriteCss(await response.text(), url.origin);
} else if (event.request.destination === "script") {
responseBody = await response.text();
// implement when js is finished
responseBody = self.__scramjet$bundle.rewriters.rewriteJs(await response.text(), url.origin);
} else {
responseBody = response.body;
}