Skip to content

Commit 84bb9e4

Browse files
add last-modified headers
1 parent b6aebe5 commit 84bb9e4

File tree

4 files changed

+31
-8
lines changed

4 files changed

+31
-8
lines changed

src/models/v2/meta.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { isPopulatedSkin2Document } from "@mineskin/database";
1111
import { Classification } from "@mineskin/database/dist/schemas/Classification";
1212

1313
//TODO
14-
export async function getSkinMeta(req: MineSkinV2Request, res: Response<V2ResponseBody>): Promise<V2MiscResponseBody> {
14+
export async function getSkinMeta(req: MineSkinV2Request, res: Response<V2ResponseBody>): Promise<V2MiscResponseBody | null> {
1515
const uuid = UUID.parse(req.params.uuid);
1616

1717
let skin = await container.get<SkinService>(GeneratorTypes.SkinService).findForUuid(uuid);
@@ -27,9 +27,21 @@ export async function getSkinMeta(req: MineSkinV2Request, res: Response<V2Respon
2727
}).exec();
2828
if (classification) {
2929
meta['description'] = classification.description;
30+
31+
// cache headers
32+
res.header('Last-Modified', classification.updatedAt.toUTCString());
33+
if (req.headers['if-modified-since']) {
34+
const ifModifiedSince = new Date(req.headers['if-modified-since']);
35+
if (classification.updatedAt <= ifModifiedSince) {
36+
res.status(304).end();
37+
return null;
38+
}
39+
}
3040
}
3141
}
3242

43+
res.header('Cache-Control', 'public, max-age=3600');
44+
3345
return {
3446
success: true,
3547
meta: meta

src/models/v2/skins.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ export async function v2ListRandomSkins(req: MineSkinV2Request, res: Response<V2
223223
}
224224

225225

226-
export async function v2GetSkin(req: MineSkinV2Request, res: Response<V2SkinResponse>): Promise<V2SkinResponse> {
226+
export async function v2GetSkin(req: MineSkinV2Request, res: Response<V2SkinResponse>): Promise<V2SkinResponse | null> {
227227
const uuidOrShort = UUIDOrShortId.parse(req.params.uuid);
228228

229229
req.links.skin = `/v2/skins/${ uuidOrShort }`;
@@ -249,6 +249,17 @@ export async function v2GetSkin(req: MineSkinV2Request, res: Response<V2SkinResp
249249

250250
skin = validateRequestedSkin(req, skin);
251251

252+
// cache headers
253+
res.header('Cache-Control', 'public, max-age=10800');
254+
res.header('Last-Modified', skin.updatedAt ? skin.updatedAt.toUTCString() : new Date().toUTCString());
255+
if (req.headers['if-modified-since'] && skin.updatedAt) {
256+
const ifModifiedSince = new Date(req.headers['if-modified-since']);
257+
if (skin.updatedAt <= ifModifiedSince) {
258+
res.status(304).end();
259+
return null;
260+
}
261+
}
262+
252263
Skin2.incRequests(skin.uuid).catch(e => Sentry.captureException(e));
253264
try {
254265
const metrics = container.get<IMetricsProvider>(CoreTypes.MetricsProvider);

src/routes/v2/images.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const router: Router = v2Router();
1010
router.use(wildcardCors);
1111

1212
router.get("/:hash", expressAsyncHandler(async (req: MineSkinV2Request, res: Response<V2SkinResponse>) => {
13-
res.header('Cache-Control', 'public, max-age=31536000');
13+
res.header('Cache-Control', 'public, max-age=31536000, immutable');
1414
await v2GetImage(req, res);
1515
}));
1616

src/routes/v2/skins.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ router.get("/random", expressAsyncHandler(async (req: MineSkinV2Request, res: Re
5252

5353
router.get("/:uuid", expressAsyncHandler(async (req: MineSkinV2Request, res: Response<V2SkinResponse>) => {
5454
const result = await v2GetSkin(req, res);
55-
res.header('Cache-Control', 'public, max-age=10800');
55+
if (!result) return;
5656
res.json(formatV2Response(req, result));
5757
}));
5858

@@ -83,7 +83,7 @@ router.post("/:uuid/tags", expressAsyncHandler(async (req: MineSkinV2Request, re
8383

8484
router.get("/:uuid/meta", expressAsyncHandler(async (req: MineSkinV2Request, res: Response<V2MiscResponseBody>) => {
8585
const result = await getSkinMeta(req, res);
86-
res.header('Cache-Control', 'public, max-age=3600');
86+
if (!result) return;
8787
res.json(formatV2Response(req, result));
8888
}));
8989

@@ -101,17 +101,17 @@ router.post("/:uuid/report", expressAsyncHandler(async (req: MineSkinV2Request,
101101
}));
102102
}));
103103

104-
router.patch("/:uuid",expressAsyncHandler(async (req: MineSkinV2Request, res: Response<V2MiscResponseBody>) => {
104+
router.patch("/:uuid", expressAsyncHandler(async (req: MineSkinV2Request, res: Response<V2MiscResponseBody>) => {
105105
const result = await v2UpdateSkin(req, res);
106106
res.json(formatV2Response(req, result));
107107
}));
108108

109-
router.delete("/:uuid",expressAsyncHandler(async (req: MineSkinV2Request, res: Response<V2MiscResponseBody>) => {
109+
router.delete("/:uuid", expressAsyncHandler(async (req: MineSkinV2Request, res: Response<V2MiscResponseBody>) => {
110110
const result = await v2DeleteSkin(req, res);
111111
res.json(formatV2Response(req, result));
112112
}));
113113

114-
router.get("/:uuid/user",expressAsyncHandler(async (req: MineSkinV2Request, res: Response<V2MiscResponseBody>) => {
114+
router.get("/:uuid/user", expressAsyncHandler(async (req: MineSkinV2Request, res: Response<V2MiscResponseBody>) => {
115115
const result = await v2GetSkinUser(req, res);
116116
res.header('Cache-Control', 'private, max-age=60');
117117
res.json(formatV2Response(req, result));

0 commit comments

Comments
 (0)