cloudflare workers: ext and mime type based on header [#58]

This commit is contained in:
Brandon Liu
2022-10-19 10:01:11 +08:00
parent 14c26d15fe
commit 150252601e
2 changed files with 34 additions and 3 deletions

View File

@@ -6,7 +6,9 @@ Use [rclone](https://rclone.org/downloads/) to upload your PMTiles archives to a
Edit `wrangler.toml` with a new name + your development and production R2 buckets. Edit `wrangler.toml` with a new name + your development and production R2 buckets.
Publish the worker: `npm deploy` Test in development: `npm run start`
Publish the worker: `npm run deploy`
# Settings # Settings

View File

@@ -9,6 +9,7 @@ import {
Source, Source,
RangeResponse, RangeResponse,
ResolvedValueCache, ResolvedValueCache,
TileType,
} from "../../../js"; } from "../../../js";
export interface Env { export interface Env {
@@ -82,13 +83,41 @@ export default {
const source = new R2Source(env, archive_name); const source = new R2Source(env, archive_name);
const p = new PMTiles(source, CACHE); const p = new PMTiles(source, CACHE);
let header = await p.getHeader();
for (const pair of [
[TileType.Mvt, "mvt"],
[TileType.Png, "png"],
[TileType.Jpeg, "jpg"],
[TileType.Webp, "webp"],
]) {
if (header.tileType === pair[0] && ext !== pair[1]) {
return new Response("Bad request: archive has type ." + pair[1], {
status: 400,
});
}
}
// TODO: optimize by checking header min/maxzoom // TODO: optimize by checking header min/maxzoom
// TODO: enforce extensions and MIME type using header information
try { try {
const tile = await p.getZxy(z, x, y); const tile = await p.getZxy(z, x, y);
const headers = new Headers(); const headers = new Headers();
headers.set("Access-Control-Allow-Origin", "*"); // TODO: make configurable headers.set("Access-Control-Allow-Origin", "*"); // TODO: make configurable
headers.set("Content-Type", "application/protobuf");
switch (header.tileType) {
case TileType.Mvt:
headers.set("Content-Type", "application/vnd.vector-tile");
break;
case TileType.Png:
headers.set("Content-Type", "image/png");
break;
case TileType.Jpeg:
headers.set("Content-Type", "image/jpeg");
break;
case TileType.Webp:
headers.set("Content-Type", "image/webp");
break;
}
// TODO: optimize by making decompression optional // TODO: optimize by making decompression optional
if (tile) { if (tile) {