diff options
Diffstat (limited to 'apps')
| -rw-r--r-- | apps/cdn/.gitignore | 5 | ||||
| -rw-r--r-- | apps/cdn/index.ts | 112 | ||||
| -rw-r--r-- | apps/cdn/package.json | 7 | ||||
| -rw-r--r-- | apps/cdn/wrangler.toml | 4 |
4 files changed, 128 insertions, 0 deletions
diff --git a/apps/cdn/.gitignore b/apps/cdn/.gitignore new file mode 100644 index 00000000..ae33762f --- /dev/null +++ b/apps/cdn/.gitignore @@ -0,0 +1,5 @@ +# Wrangler +.wrangler + +# Node.js +node_modules diff --git a/apps/cdn/index.ts b/apps/cdn/index.ts new file mode 100644 index 00000000..55c51256 --- /dev/null +++ b/apps/cdn/index.ts @@ -0,0 +1,112 @@ +// <https://github.com/soruly/trace.moe-www/blob/master/image-proxy.js> + +addEventListener("fetch", async (event) => { + event.respondWith(handleRequest(event.request)); +}); + +const errorResponse = (errorMessage) => + new Response(errorMessage, { + status: 400, + statusText: "Bad Request", + }); + +const handleRequest = async (originalRequest) => { + let originalURL = new URL(originalRequest.url); + if (!originalURL.searchParams.get("url")) { + return errorResponse("Error: Cannot get url from param"); + } + + let imageURL = null; + try { + imageURL = new URL(originalURL.searchParams.get("url")); + } catch (e) {} + if (!imageURL) { + return errorResponse("Error: Invalid URL string"); + } + + let imageRequest = new Request(imageURL, { + redirect: "follow", + headers: { + referer: imageURL.origin, + }, + }); + + let response = await fetch(imageRequest, { + cf: { + polish: "lossy", + cacheEverything: true, + }, + }); + + if (response.status >= 400) { + return new Response(response.body, { + status: response.status, + statusText: response.statusText, + headers: response.headers, + }); + } + + // if ( + // response.headers.get("Content-Type").toLowerCase() !== + // "application/octet-stream" && + // !["image", "video"].includes( + // response.headers.get("Content-Type").split("/")[0].toLowerCase() + // ) + // ) { + // // retry as bot to get og:image + // let webResponse = await fetch( + // new Request(imageURL, { + // redirect: "follow", + // headers: { + // referer: imageURL.origin, + // "User-Agent": "googlebot", + // }, + // }) + // ); + // if (response.status === 200) { + // const ogImageURL = (await webResponse.text()) + // ?.match(/<[^<]+?"og:image".*?>/, "$1")?.[0] + // ?.match(/content="(.*?)"/, "$1")?.[1]; + + // if (ogImageURL && ogImageURL.match(/^https?:\/\//)) { + // response = await fetch( + // new Request(ogImageURL, { + // redirect: "follow", + // headers: { + // referer: imageURL.origin, + // }, + // }) + // ); + // if (response.status >= 400) { + // return new Response(response.body, { + // status: response.status, + // statusText: response.statusText, + // headers: response.headers, + // }); + // } + // } + // } + // } + // if ( + // response.headers.get("Content-Type").toLowerCase() !== + // "application/octet-stream" && + // !["image", "video"].includes( + // response.headers.get("Content-Type").split("/")[0].toLowerCase() + // ) + // ) { + // return errorResponse( + // "Error: Content-Type is not image or video or application/octet-stream" + // ); + // } + + return new Response(response.body, { + status: response.status, + statusText: response.statusText, + headers: { + "Cache-Control": + "public, immutable, s-maxage=31536000, max-age=31536000, stale-while-revalidate=60", + "Access-Control-Allow-Origin": "https://due.moe", + ...response.headers, + }, + }); +}; diff --git a/apps/cdn/package.json b/apps/cdn/package.json new file mode 100644 index 00000000..33970b95 --- /dev/null +++ b/apps/cdn/package.json @@ -0,0 +1,7 @@ +{ + "private": true, + "devDependencies": { + "@types/node": "^17.0.42", + "typescript": "^4.7.3" + } +} diff --git a/apps/cdn/wrangler.toml b/apps/cdn/wrangler.toml new file mode 100644 index 00000000..adb3e071 --- /dev/null +++ b/apps/cdn/wrangler.toml @@ -0,0 +1,4 @@ +name = "cdn" +main = "./index.ts" +compatibility_date = "2023-10-30" + |