Inject proxy script in all routes (#1623)

<!-- CURSOR_SUMMARY -->
> [!NOTE]
> Broaden injection to extensionless and .html routes, gate by
Content-Type, and conditionally strip caching/compression headers only
when injecting.
> 
> - **Proxy HTML injection**:
> - Update `needsInjection(pathname)` to inject for routes without
extensions and `.html` files (e.g., `/`, `/foo`, `/foo/bar`, `*.html`).
> - Only request uncompressed content and remove `if-none-match` when
`needsInjection(target.pathname)` is true.
> - During upstream response, inject only if `Content-Type` includes
`text/html`; otherwise pass through without modification.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
2986ceccea64e7881a2197a2a0b202216f21d27d. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
This commit is contained in:
Will Chen
2025-10-24 13:56:24 -07:00
committed by GitHub
parent ab85c4be19
commit d837abe5e6

View File

@@ -85,7 +85,9 @@ try {
/* ---------------------- helper: need to inject? ------------------------ */ /* ---------------------- helper: need to inject? ------------------------ */
function needsInjection(pathname) { function needsInjection(pathname) {
return pathname.endsWith("index.html") || pathname === "/"; // Inject for routes without a file extension (e.g., "/foo", "/foo/bar", "/")
const ext = path.extname(pathname).toLowerCase();
return ext === "" || ext === ".html";
} }
function injectHTML(buf) { function injectHTML(buf) {
@@ -171,13 +173,12 @@ const server = http.createServer((clientReq, clientRes) => {
delete headers.referer; delete headers.referer;
} }
} }
if (needsInjection) { if (needsInjection(target.pathname)) {
// Request uncompressed content from upstream // Request uncompressed content from upstream
delete headers["accept-encoding"]; delete headers["accept-encoding"];
} // Avoid getting cached resources.
if (headers["if-none-match"] && needsInjection(target.pathname))
delete headers["if-none-match"]; delete headers["if-none-match"];
}
const upOpts = { const upOpts = {
protocol: target.protocol, protocol: target.protocol,
@@ -189,7 +190,16 @@ const server = http.createServer((clientReq, clientRes) => {
}; };
const upReq = lib.request(upOpts, (upRes) => { const upReq = lib.request(upOpts, (upRes) => {
const inject = needsInjection(target.pathname); const wantsInjection = needsInjection(target.pathname);
// Only inject when upstream indicates HTML content
const contentTypeHeader = upRes.headers["content-type"];
const contentType = Array.isArray(contentTypeHeader)
? contentTypeHeader[0]
: contentTypeHeader || "";
const isHtml =
typeof contentType === "string" &&
contentType.toLowerCase().includes("text/html");
const inject = wantsInjection && isHtml;
if (!inject) { if (!inject) {
clientRes.writeHead(upRes.statusCode, upRes.headers); clientRes.writeHead(upRes.statusCode, upRes.headers);