From 9079c896a9c290d1245239f97e786300d47dff12 Mon Sep 17 00:00:00 2001 From: Ophir LOJKINE Date: Mon, 3 Aug 2026 16:56:39 +0200 Subject: [PATCH 1/2] Use modern user agent for proxy requests --- dezoomers/seadragon.js | 4 ++-- functions/proxy.js | 4 +++- tests/dezoomers.spec.js | 5 +++++ .../remote/fixtures.test/deepzoom/jpeg.dzi | 1 + tests/proxy-function.spec.js | 22 +++++++++++++++++++ 5 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 tests/fixtures/remote/fixtures.test/deepzoom/jpeg.dzi diff --git a/dezoomers/seadragon.js b/dezoomers/seadragon.js index 93bbd71..ecdd67d 100644 --- a/dezoomers/seadragon.js +++ b/dezoomers/seadragon.js @@ -33,7 +33,7 @@ var seadragon = (function () { //Code isolation /polona\.pl\/item\//, /bibliotheques-specialisees\.paris\.fr\/ark/, /nla\.gov\.au\/nla\.obj.*\/view$/, - /_files\/\d+\/\d+_\d+\.(?:jpg|png)$/, + /_files\/\d+\/\d+_\d+\.(?:jpe?g|png)$/, /dzi$/ ], "contents": [ @@ -84,7 +84,7 @@ var seadragon = (function () { //Code isolation } // A single tile URL - var tileMatch = baseUrl.match(/(.*)_files\/\d+\/\d+_\d+\.(?:jpg|png)$/); + var tileMatch = baseUrl.match(/(.*)_files\/\d+\/\d+_\d+\.(?:jpe?g|png)$/); if (tileMatch) { // We need to detect whether the image is a dzi or an xml var decided_xml_dzi = false, possibilities = [tileMatch[1] + ".dzi", tileMatch[1] + ".xml"], errors = []; diff --git a/functions/proxy.js b/functions/proxy.js index 6d68941..7b69f42 100644 --- a/functions/proxy.js +++ b/functions/proxy.js @@ -1,4 +1,6 @@ const MAX_REDIRECTS = 3; +const USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36"; function corsHeaders(headers) { headers.set("Access-Control-Allow-Origin", "*"); @@ -20,7 +22,7 @@ export async function proxy(request) { const target = new URL(targetUrl); const headers = new Headers({ - "User-Agent": request.headers.get("User-Agent") || "Mozilla/5.0", + "User-Agent": USER_AGENT, "Accept": request.headers.get("Accept") || "*/*", "Accept-Language": request.headers.get("Accept-Language") || "en-US,en;q=0.5", "Accept-Encoding": "identity", diff --git a/tests/dezoomers.spec.js b/tests/dezoomers.spec.js index a471fbf..b0e8fd4 100644 --- a/tests/dezoomers.spec.js +++ b/tests/dezoomers.spec.js @@ -124,6 +124,11 @@ test.describe("dezoomer fixture coverage", () => { url: "https://fixtures.test/deepzoom/png_files/9/1_1.png", expectedTile: "https://fixtures.test/deepzoom/png_files/9/1_1.png", }, + { + dezoomer: "Seadragon (Deep Zoom Image)", + url: "https://fixtures.test/deepzoom/jpeg_files/9/1_1.jpeg", + expectedTile: "https://fixtures.test/deepzoom/jpeg_files/9/1_1.jpeg", + }, { dezoomer: "Seadragon (Deep Zoom Image)", url: "https://fixtures.test/deepzoom/legacy-embed.html", diff --git a/tests/fixtures/remote/fixtures.test/deepzoom/jpeg.dzi b/tests/fixtures/remote/fixtures.test/deepzoom/jpeg.dzi new file mode 100644 index 0000000..30c26cd --- /dev/null +++ b/tests/fixtures/remote/fixtures.test/deepzoom/jpeg.dzi @@ -0,0 +1 @@ + diff --git a/tests/proxy-function.spec.js b/tests/proxy-function.spec.js index b61d30a..87b86da 100644 --- a/tests/proxy-function.spec.js +++ b/tests/proxy-function.spec.js @@ -24,6 +24,28 @@ test.describe("Cloudflare Pages proxy function", () => { expect(headResponse.headers.get("content-type")).toBe("text/plain"); expect(await headResponse.text()).toBe(""); }); + + test("uses a modern browser user agent for upstream requests", async () => { + const proxy = await loadProxyFunction(); + const originalFetch = global.fetch; + let userAgent; + global.fetch = async (_url, options) => { + userAgent = options.headers.get("User-Agent"); + return new Response("ok"); + }; + + try { + await proxy.onRequestGet({ + request: new Request("http://example.test/proxy?url=https%3A%2F%2Fexample.com", { + headers: { "User-Agent": "Mozilla/5.0 Chrome/58.0.3029.110" }, + }), + }); + } finally { + global.fetch = originalFetch; + } + + expect(userAgent).toContain("Chrome/149.0.0.0"); + }); }); test.describe("Node proxy adapter", () => { From 03989fd8831f19f560667016424e05f3f4ec1fae Mon Sep 17 00:00:00 2001 From: Ophir LOJKINE Date: Mon, 3 Aug 2026 17:08:09 +0200 Subject: [PATCH 2/2] Keep forwarding proxy user agents --- functions/proxy.js | 4 +--- tests/proxy-function.spec.js | 22 ---------------------- 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/functions/proxy.js b/functions/proxy.js index 7b69f42..6d68941 100644 --- a/functions/proxy.js +++ b/functions/proxy.js @@ -1,6 +1,4 @@ const MAX_REDIRECTS = 3; -const USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + - "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36"; function corsHeaders(headers) { headers.set("Access-Control-Allow-Origin", "*"); @@ -22,7 +20,7 @@ export async function proxy(request) { const target = new URL(targetUrl); const headers = new Headers({ - "User-Agent": USER_AGENT, + "User-Agent": request.headers.get("User-Agent") || "Mozilla/5.0", "Accept": request.headers.get("Accept") || "*/*", "Accept-Language": request.headers.get("Accept-Language") || "en-US,en;q=0.5", "Accept-Encoding": "identity", diff --git a/tests/proxy-function.spec.js b/tests/proxy-function.spec.js index 87b86da..b61d30a 100644 --- a/tests/proxy-function.spec.js +++ b/tests/proxy-function.spec.js @@ -24,28 +24,6 @@ test.describe("Cloudflare Pages proxy function", () => { expect(headResponse.headers.get("content-type")).toBe("text/plain"); expect(await headResponse.text()).toBe(""); }); - - test("uses a modern browser user agent for upstream requests", async () => { - const proxy = await loadProxyFunction(); - const originalFetch = global.fetch; - let userAgent; - global.fetch = async (_url, options) => { - userAgent = options.headers.get("User-Agent"); - return new Response("ok"); - }; - - try { - await proxy.onRequestGet({ - request: new Request("http://example.test/proxy?url=https%3A%2F%2Fexample.com", { - headers: { "User-Agent": "Mozilla/5.0 Chrome/58.0.3029.110" }, - }), - }); - } finally { - global.fetch = originalFetch; - } - - expect(userAgent).toContain("Chrome/149.0.0.0"); - }); }); test.describe("Node proxy adapter", () => {