handle unicode characters when encoding

This commit is contained in:
illusionTBA 2024-10-09 13:08:03 -04:00
parent 33bcfaedab
commit 7aaf3b7ceb

View file

@ -10,7 +10,7 @@ export function rewriteHtml(
html: string,
cookieStore: CookieStore,
meta: URLMeta,
fromTop: boolean = false,
fromTop: boolean = false
) {
const handler = new DomHandler((err, dom) => dom);
const parser = new Parser(handler);
@ -56,7 +56,7 @@ export function rewriteHtml(
script(self.$scramjet.config["codecs"]),
script("data:application/javascript;base64," + btoa(injected)),
script(self.$scramjet.config["shared"]),
script(self.$scramjet.config["client"]),
script(self.$scramjet.config["client"])
);
}
@ -157,7 +157,7 @@ export const htmlRules: {
origin: new URL(meta.origin.origin),
base: new URL(meta.origin.origin),
},
true,
true
),
// srcdoc
@ -180,7 +180,7 @@ export const htmlRules: {
function traverseParsedHtml(
node: any,
cookieStore: CookieStore,
meta: URLMeta,
meta: URLMeta
) {
if (node.name === "base" && node.attribs.href !== undefined) {
meta.base = new URL(node.attribs.href, meta.origin);
@ -213,12 +213,15 @@ function traverseParsedHtml(
if (
node.name === "script" &&
/(application|text)\/javascript|module|importmap|undefined/.test(
node.attribs.type,
node.attribs.type
) &&
node.children[0] !== undefined
) {
let js = node.children[0].data;
node.attribs[`data-scramjet-script-source-src`] = btoa(js);
// node.attribs[`data-scramjet-script-source-src`] = btoa(js);
node.attribs[`data-scramjet-script-source-src`] = bytesToBase64(
new TextEncoder().encode(js)
);
const htmlcomment = /<!--[\s\S]*?-->/g;
js = js.replace(htmlcomment, "");
node.children[0].data = rewriteJs(js, meta);
@ -245,7 +248,7 @@ function traverseParsedHtml(
node.childNodes[childNode] = traverseParsedHtml(
node.childNodes[childNode],
cookieStore,
meta,
meta
);
}
}
@ -266,3 +269,15 @@ export function rewriteSrcset(srcset: string, meta: URLMeta) {
return rewrittenUrls.join("");
}
function base64ToBytes(base64) {
const binString = atob(base64);
return Uint8Array.from(binString, (m) => m.codePointAt(0));
}
function bytesToBase64(bytes: Uint8Array) {
const binString = Array.from(bytes, (byte) =>
String.fromCodePoint(byte)
).join("");
return btoa(binString);
}