From c9e3376d217b2ed439651a540c7beb3eea07ce36 Mon Sep 17 00:00:00 2001 From: Joe Ma Date: Thu, 2 Jun 2022 14:13:54 +0800 Subject: [PATCH] Enable Cloudflare cache Signed-off-by: Joe Ma --- paste.html | 7 +++--- src/index.ts | 65 ++++++++++++++++++++++++++++++++++------------------ 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/paste.html b/paste.html index ab9957b..e36b606 100644 --- a/paste.html +++ b/paste.html @@ -24,8 +24,7 @@ -

Paste service - paste.nekoul.com

-[Homepage][API] +

Paste Service

Upload file

@@ -63,6 +62,8 @@ document.getElementById("text_input").addEventListener("input", update_textarea, false); -

© 2022 rikkaneko

+
+[Homepage][API] +

© 2022 rikkaneko

diff --git a/src/index.ts b/src/index.ts index b44c60b..e06f8d7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -86,7 +86,11 @@ export default { switch (method) { // Fetch the HTML for uploading text/file case "GET": { - return await fetch(PASTE_INDEX_HTML_URL).then(value => { + return await fetch(PASTE_INDEX_HTML_URL, { + cf: { + cacheEverything: true + } + }).then(value => { let res = new Response(value.body, value); // Add the correct content-type to response header res.headers.set("content-type", "text/html; charset=UTF-8"); @@ -208,32 +212,45 @@ export default { switch (method) { // Fetch the paste by uuid case "GET": { - let res = await s3.fetch(`${env.ENDPOINT}/${uuid}`, { - method: "GET" - }); - // Stream request - let {readable, writable} = new TransformStream(); - if (res.body === null) { - // UUID exists in index but not found in remote object storage service - return new Response("Internal server error.\n", { - status: 500 + // Enable CF cache for authorized request + let cache = caches.default; + // Match in existing cache + let res = await cache.match(request.url); + if (res === undefined) { + // Fetch form origin if not hit cache + let origin = await s3.fetch(`${env.ENDPOINT}/${uuid}`, { + method: "GET" }); - } - // Streaming request - res.body.pipeTo(writable); - // Handle response format - // Direct download - if (option === "download") { - return new Response(readable, { - headers: { - "Content-Disposition": `attachment; filename="${encodeURIComponent(descriptor.title ?? uuid)}"` + res = new Response(origin.body, origin); + // Remove x-amz-* headers + for (let [key, value] of res.headers.entries()) { + if (key.startsWith("x-amz")) { + res.headers.delete(key); } - }); + } + + if (!res.ok) { + // UUID exists in index but not found in remote object storage service + return new Response("Internal server error.\n", { + status: 500 + }); + } + + res.headers.append("Cache-Control", "max-age=3600"); + + if (option === "download") { + res.headers.append("Content-Disposition", + `attachment; filename="${encodeURIComponent(descriptor.title ?? uuid)}"`); + } + + // res.body cannot be read twice + await cache.put(request.url, res.clone()); + return res; } - // Default format - return new Response(readable); + // Cache hit + return res; } // Delete paste by uuid @@ -252,6 +269,10 @@ export default { await env.PASTE_INDEX.delete(uuid); let counter = await env.PASTE_INDEX.get("__count__") || "1"; await env.PASTE_INDEX.put("__count__", (Number(counter) - 1).toString()); + + // Invalidate CF cache + let cache = caches.default; + await cache.delete(request.url); return new Response("OK\n"); } else { return new Response("Unable to process such request.\n", {