diff --git a/public/__redirects b/public/__redirects index 881f7070b83e588..46d1fc40147db7c 100644 --- a/public/__redirects +++ b/public/__redirects @@ -1427,6 +1427,7 @@ /r2/examples/postman/ /r2/tutorials/postman/ 301 /r2/examples/cloudflare-access/ /r2/tutorials/cloudflare-access/ 301 /r2/examples/upload-logs-event-notifications/ /r2/tutorials/upload-logs-event-notifications/ 301 +/r2/examples/demo-worker/ /r2/api/workers/workers-api-usage/ 301 # time-services_redirects /time-services/nts/usage/ /time-services/nts/ 301 diff --git a/src/content/docs/r2/examples/demo-worker.mdx b/src/content/docs/r2/examples/demo-worker.mdx deleted file mode 100644 index dd10ca3bac90391..000000000000000 --- a/src/content/docs/r2/examples/demo-worker.mdx +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: Expose an R2 bucket to the Internet via a Worker -pcx_content_type: example - ---- - -Below is an example Worker that exposes an R2 bucket to the Internet and demonstrates its functionality for storing and retrieving objects. - -For a simpler guide level explanation of how to use R2 in a worker, refer to [use R2 in a Worker](/r2/api/workers/workers-api-usage/). - -```ts -interface Env { - MY_BUCKET: R2Bucket -} - -function objectNotFound(objectName: string): Response { - return new Response(`R2 object "${objectName}" not found`, { - status: 404, - headers: { - 'content-type': 'text/html; charset=UTF-8' - } - }) -} - -export default { - async fetch(request, env): Promise { - const url = new URL(request.url) - const objectName = url.pathname.slice(1) - - console.log(`${request.method} object ${objectName}: ${request.url}`) - - if (request.method === 'GET' || request.method === 'HEAD') { - if (objectName === '') { - if (request.method == 'HEAD') { - return new Response(undefined, { status: 400 }) - } - - const options: R2ListOptions = { - prefix: url.searchParams.get('prefix') ?? undefined, - delimiter: url.searchParams.get('delimiter') ?? undefined, - cursor: url.searchParams.get('cursor') ?? undefined, - include: ['customMetadata', 'httpMetadata'], - } - console.log(JSON.stringify(options)) - - const listing = await env.MY_BUCKET.list(options) - return new Response(JSON.stringify(listing), {headers: { - 'content-type': 'application/json; charset=UTF-8', - }}) - } - - if (request.method === 'GET') { - const object = await env.MY_BUCKET.get(objectName, { - range: request.headers, - onlyIf: request.headers, - }) - - if (object === null) { - return objectNotFound(objectName) - } - - const headers = new Headers() - object.writeHttpMetadata(headers) - headers.set('etag', object.httpEtag) - if (object.range) { - headers.set("content-range", `bytes ${object.range.offset}-${object.range.end ?? object.size - 1}/${object.size}`) - } - const status = object.body ? (request.headers.get("range") !== null ? 206 : 200) : 304 - return new Response(object.body, { - headers, - status - }) - } - - const object = await env.MY_BUCKET.head(objectName) - - if (object === null) { - return objectNotFound(objectName) - } - - const headers = new Headers() - object.writeHttpMetadata(headers) - headers.set('etag', object.httpEtag) - return new Response(null, { - headers, - }) - } - if (request.method === 'PUT' || request.method == 'POST') { - const object = await env.MY_BUCKET.put(objectName, request.body, { - httpMetadata: request.headers, - }) - return new Response(null, { - headers: { - 'etag': object.httpEtag, - } - }) - } - if (request.method === 'DELETE') { - await env.MY_BUCKET.delete(url.pathname.slice(1)) - return new Response() - } - - return new Response(`Unsupported method`, { - status: 400 - }) - } -} satisfies ExportedHandler; -```