Skip to content

Commit 4791d3f

Browse files
committed
[scramjet] fix regex for link headers and properly unrewrite link headers
1 parent 1e08450 commit 4791d3f

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed

packages/scramjet/src/client/shared/requests/fetch.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { rewriteUrl, unrewriteUrl } from "@rewriters/url";
22
import { ScramjetClient } from "@client/index";
3+
import { unrewriteLinkHeader } from "./xmlhttprequest";
34

45
export default function (client: ScramjetClient) {
56
client.Proxy("fetch", {
@@ -29,4 +30,20 @@ export default function (client: ScramjetClient) {
2930
return unrewriteUrl(ctx.get() as string, client.meta);
3031
},
3132
});
33+
34+
// TODO: this needs to be only for response objects created from a fetch
35+
client.Trap("Response.prototype.headers", {
36+
get(ctx) {
37+
const headers = ctx.get() as Headers;
38+
const newHeaders = new Headers();
39+
40+
for (const [key, value] of headers.entries()) {
41+
if (key.toLowerCase() === "link") {
42+
newHeaders.append(key, unrewriteLinkHeader(value, client.meta));
43+
} else {
44+
newHeaders.append(key, value);
45+
}
46+
}
47+
},
48+
});
3249
}

packages/scramjet/src/client/shared/requests/xmlhttprequest.ts

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { config, flagEnabled } from "@/shared";
2-
import { rewriteUrl, unrewriteUrl } from "@rewriters/url";
2+
import { rewriteUrl, unrewriteUrl, URLMeta } from "@rewriters/url";
33
import { ScramjetClient } from "@client/index";
44

55
export default function (client: ScramjetClient, self: Self) {
@@ -116,7 +116,6 @@ export default function (client: ScramjetClient, self: Self) {
116116
},
117117
});
118118

119-
// send has no return value right
120119
ctx.return(undefined);
121120
},
122121
});
@@ -126,4 +125,39 @@ export default function (client: ScramjetClient, self: Self) {
126125
return unrewriteUrl(ctx.get() as string, client.meta);
127126
},
128127
});
128+
129+
client.Proxy("XMLHttpRequest.prototype.getAllResponseHeaders", {
130+
apply(ctx) {
131+
const headerstring = ctx.fn.call(ctx.this) as string;
132+
if (!headerstring) return headerstring;
133+
const headers = headerstring.split("\r\n");
134+
135+
for (const [i, header] of headers.entries()) {
136+
if (header.toLowerCase().startsWith("link:")) {
137+
headers[i] = `Link: ${unrewriteLinkHeader(
138+
header.slice(5).trim(),
139+
client.meta
140+
)}`;
141+
}
142+
}
143+
144+
ctx.return(headers.join("\r\n"));
145+
},
146+
});
147+
client.Proxy("XMLHttpRequest.prototype.getResponseHeader", {
148+
apply(ctx) {
149+
const header = ctx.fn.call(ctx.this, ctx.args[0]) as string | null;
150+
if (!header) return header;
151+
if (ctx.args[0].toLowerCase() === "link") {
152+
ctx.return(unrewriteLinkHeader(header, client.meta));
153+
}
154+
},
155+
});
156+
}
157+
158+
export function unrewriteLinkHeader(header: string, meta: URLMeta) {
159+
return header.replace(
160+
/<([^>]+)>/gi,
161+
(match) => `${unrewriteUrl(match, meta)}`
162+
);
129163
}

packages/scramjet/src/worker/fetch.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export class ScramjetFetchHandler extends EventTarget {
7575
this.prefix = init.prefix;
7676

7777
iface.onServerbound("setCookie", ({ cookie, url }) => {
78+
console.log("recv'd cookies");
7879
this.cookieJar.setCookies([cookie], new URL(url));
7980

8081
return undefined;
@@ -584,7 +585,7 @@ const SEC_HEADERS = new Set([
584585
const URL_HEADERS = new Set(["location", "content-location", "referer"]);
585586

586587
function rewriteLinkHeader(link: string, meta: URLMeta) {
587-
return link.replace(/<(.*)>/gi, (match) => rewriteUrl(match, meta));
588+
return link.replace(/<([^>]+)>/gi, (match) => `<${rewriteUrl(match, meta)}>`);
588589
}
589590

590591
export async function rewriteHeaders(

0 commit comments

Comments
 (0)