diff --git a/serverless/aws/src/index.ts b/serverless/aws/src/index.ts index 365e08f..ed46e9d 100644 --- a/serverless/aws/src/index.ts +++ b/serverless/aws/src/index.ts @@ -11,6 +11,7 @@ import { ResolvedValueCache, Source, TileType, + tileTypeExt, } from "pmtiles"; import { pmtiles_path, tile_path } from "../../shared/index"; @@ -191,25 +192,28 @@ export const handlerRaw = async ( return apiResp(404, "", false, headers); } - for (const pair of [ - [TileType.Mvt, "mvt"], - [TileType.Png, "png"], - [TileType.Jpeg, "jpg"], - [TileType.Webp, "webp"], - [TileType.Avif, "avif"], - ]) { - if (header.tileType === pair[0] && ext !== pair[1]) { - if (header.tileType === TileType.Mvt && ext === "pbf") { - // allow this for now. Eventually we will delete this in favor of .mvt - continue; - } - return apiResp( - 400, - `Bad request: requested .${ext} but archive has type .${pair[1]}`, - false, - headers - ); - } + const extToType: Record = { + mvt: TileType.Mvt, + pbf: TileType.Mvt, // allow this for now. Eventually we will delete this in favor of .mvt + png: TileType.Png, + jpg: TileType.Jpeg, + webp: TileType.Webp, + avif: TileType.Avif, + }; + + const expectedType = extToType[ext]; + if ( + header.tileType !== expectedType && + tileTypeExt(header.tileType) !== "" + ) { + return apiResp( + 400, + `Bad request: requested .${ext} but archive has type ${tileTypeExt( + header.tileType + )}`, + false, + headers + ); } const tileResult = await p.getZxy(tile[0], tile[1], tile[2]); diff --git a/serverless/cloudflare/src/index.ts b/serverless/cloudflare/src/index.ts index 07fb22a..224de13 100644 --- a/serverless/cloudflare/src/index.ts +++ b/serverless/cloudflare/src/index.ts @@ -6,6 +6,7 @@ import { ResolvedValueCache, Source, TileType, + tileTypeExt, } from "pmtiles"; import { pmtiles_path, tile_path } from "../../shared/index"; @@ -169,24 +170,27 @@ export default { return cacheableResponse(undefined, cacheableHeaders, 404); } - for (const pair of [ - [TileType.Mvt, "mvt"], - [TileType.Png, "png"], - [TileType.Jpeg, "jpg"], - [TileType.Webp, "webp"], - [TileType.Avif, "avif"], - ]) { - if (pHeader.tileType === pair[0] && ext !== pair[1]) { - if (pHeader.tileType === TileType.Mvt && ext === "pbf") { - // allow this for now. Eventually we will delete this in favor of .mvt - continue; - } - return cacheableResponse( - `Bad request: requested .${ext} but archive has type .${pair[1]}`, - cacheableHeaders, - 400 - ); - } + const extToType: Record = { + mvt: TileType.Mvt, + pbf: TileType.Mvt, // allow this for now. Eventually we will delete this in favor of .mvt + png: TileType.Png, + jpg: TileType.Jpeg, + webp: TileType.Webp, + avif: TileType.Avif, + }; + + const expectedType = extToType[ext]; + if ( + pHeader.tileType !== expectedType && + tileTypeExt(pHeader.tileType) !== "" + ) { + return cacheableResponse( + `Bad request: requested .${ext} but archive has type ${tileTypeExt( + pHeader.tileType + )}`, + cacheableHeaders, + 400 + ); } const tiledata = await p.getZxy(tile[0], tile[1], tile[2]);