From 02835499018f78771246fe393298d3b2f8e9eb58 Mon Sep 17 00:00:00 2001 From: tdurieux Date: Fri, 13 Aug 2021 00:34:09 +0200 Subject: [PATCH] improve browser cache strategy --- src/routes/file.ts | 2 ++ src/routes/repository-private.ts | 34 ++++++++++++++++++++++---------- src/routes/repository-public.ts | 20 ++++++++----------- src/server.ts | 8 +++++++- 4 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/routes/file.ts b/src/routes/file.ts index 636cda3..ed63eb4 100644 --- a/src/routes/file.ts +++ b/src/routes/file.ts @@ -29,6 +29,8 @@ router.get( res.attachment( anonymizedPath.substring(anonymizedPath.lastIndexOf("/") + 1) ); + // ache the file for 6 hours + res.header('Cache-Control', 'max-age=21600000'); await f.send(res); } catch (error) { return handleError(error, res); diff --git a/src/routes/repository-private.ts b/src/routes/repository-private.ts index efb6133..6e05113 100644 --- a/src/routes/repository-private.ts +++ b/src/routes/repository-private.ts @@ -3,11 +3,7 @@ import { ensureAuthenticated } from "./connection"; import * as db from "../database/database"; import { getRepo, getUser, handleError } from "./route-utils"; -import RepositoryModel from "../database/repositories/repositories.model"; -import { - GitHubRepository, - getRepositoryFromGitHub, -} from "../source/GitHubRepository"; +import { getRepositoryFromGitHub } from "../source/GitHubRepository"; import gh = require("parse-github-url"); import GitHubBase from "../source/GitHubBase"; import AnonymizedRepositoryModel from "../database/anonymizedRepositories/anonymizedRepositories.model"; @@ -17,6 +13,22 @@ import Repository from "../Repository"; const router = express.Router(); +// get repository information +router.get("/:repoId/", async (req: express.Request, res: express.Response) => { + const repo = await getRepo(req, res, { nocheck: true }); + if (!repo) return; + + try { + const user = await getUser(req); + if (user.username != repo.model.owner) { + return res.status(401).send({ error: "not_authorized" }); + } + res.json((await db.getRepository(req.params.repoId)).toJSON()); + } catch (error) { + handleError(error, res); + } +}); + // user needs to be connected for all user API router.use(ensureAuthenticated); @@ -254,28 +266,30 @@ router.post("/", async (req: express.Request, res: express.Response) => { owner: r.owner, repo: r.name, }); - + const repo = new AnonymizedRepositoryModel(); repo.repoId = repoUpdate.repoId; repo.anonymizeDate = new Date(); repo.owner = user.username; repo.source = { type: - repoUpdate.options.mode == "download" ? "GitHubDownload" : "GitHubStream", + repoUpdate.options.mode == "download" + ? "GitHubDownload" + : "GitHubStream", accessToken: user.accessToken, repositoryId: repository.model.id, repositoryName: repoUpdate.fullName, }; - + if (repo.source.type == "GitHubDownload") { // details.size is in kilobytes if (repository.size > config.MAX_REPO_SIZE) { return res.status(500).send({ error: "invalid_mode" }); } } - + updateRepoModel(repo, repoUpdate); - + await repo.save(); res.send("ok"); new Repository(repo).anonymize(); diff --git a/src/routes/repository-public.ts b/src/routes/repository-public.ts index 0762498..9a161e0 100644 --- a/src/routes/repository-public.ts +++ b/src/routes/repository-public.ts @@ -2,21 +2,10 @@ import * as express from "express"; import config from "../../config"; import * as db from "../database/database"; -import { getRepo, getUser, handleError } from "./route-utils"; +import { getRepo, handleError } from "./route-utils"; const router = express.Router(); -router.get("/:repoId/", async (req: express.Request, res: express.Response) => { - const repo = await getRepo(req, res, { nocheck: true }); - if (!repo) return; - - try { - res.json((await db.getRepository(req.params.repoId)).toJSON()); - } catch (error) { - handleError(error, res); - } -}); - router.get( "/:repoId/zip", async (req: express.Request, res: express.Response) => { @@ -27,6 +16,10 @@ router.get( try { res.attachment(`${repo.repoId}.zip`); + + // ache the file for 6 hours + res.header('Cache-Control', 'max-age=21600000'); + repo.zip().pipe(res); } catch (error) { handleError(error, res); @@ -40,6 +33,9 @@ router.get( const repo = await getRepo(req, res); if (!repo) return; try { + // ache the file for 6 hours + res.header('Cache-Control', 'max-age=21600000'); + res.json(await repo.anonymizedFiles({ includeSha: false })); } catch (error) { handleError(error, res); diff --git a/src/server.ts b/src/server.ts index 11901b1..761824b 100644 --- a/src/server.ts +++ b/src/server.ts @@ -85,7 +85,13 @@ export default async function start() { .get("/r/:repoId/?*", indexResponse) .get("/repository/:repoId/?*", indexResponse); - app.use(express.static(path.join(__dirname, "..", "public"))); + app.use( + express.static(path.join(__dirname, "..", "public"), { + etag: true, + lastModified: true, + maxAge: 3600000, // 1h + }) + ); app.get("*", indexResponse);