From 4dba9ef72469707547528e2cc1f3baabd505caf4 Mon Sep 17 00:00:00 2001 From: chris48s Date: Wed, 24 Jul 2024 19:38:21 +0100 Subject: [PATCH 1/2] cache text only static badges for longer --- core/base-service/base-static.js | 6 +++++- core/base-service/cache-headers.js | 7 +++++-- core/server/server.spec.js | 11 ++++++++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/core/base-service/base-static.js b/core/base-service/base-static.js index d2523cce547a2..70c9969a176cc 100644 --- a/core/base-service/base-static.js +++ b/core/base-service/base-static.js @@ -47,7 +47,11 @@ export default class BaseStaticService extends BaseService { const format = (match.slice(-1)[0] || '.svg').replace(/^\./, '') badgeData.format = format - setCacheHeadersForStaticResource(ask.res) + let maxAge = 24 * 3600 // 1 day + if (!queryParams.logo && !badgeData.isError) { + maxAge = 5 * 24 * 3600 // 5 days + } + setCacheHeadersForStaticResource(ask.res, maxAge) const svg = makeBadge(badgeData) makeSend(format, ask.res, end)(svg) diff --git a/core/base-service/cache-headers.js b/core/base-service/cache-headers.js index 881af81d0426d..bbecf6a53742e 100644 --- a/core/base-service/cache-headers.js +++ b/core/base-service/cache-headers.js @@ -90,8 +90,11 @@ function setCacheHeaders({ setHeadersForCacheLength(res, cacheLengthSeconds) } -const staticCacheControlHeader = `max-age=${24 * 3600}, s-maxage=${24 * 3600}` // 1 day. -function setCacheHeadersForStaticResource(res) { +function setCacheHeadersForStaticResource( + res, + maxAge = 24 * 3600, // 1 day +) { + const staticCacheControlHeader = `max-age=${maxAge}, s-maxage=${maxAge}` res.setHeader('Cache-Control', staticCacheControlHeader) res.setHeader('Last-Modified', serverStartTimeGMTString) } diff --git a/core/server/server.spec.js b/core/server/server.spec.js index 32c0e04bf892b..741b2e92dad0a 100644 --- a/core/server/server.spec.js +++ b/core/server/server.spec.js @@ -59,8 +59,17 @@ describe('The server', function () { expect(headers['cache-control']).to.equal('max-age=300, s-maxage=300') }) - it('should serve badges with custom maxAge', async function () { + it('should serve static badges without logo with maxAge=432000', async function () { const { headers } = await got(`${baseUrl}badge/foo-bar-blue`) + expect(headers['cache-control']).to.equal( + 'max-age=432000, s-maxage=432000', + ) + }) + + it('should serve badges with with logo with maxAge=86400', async function () { + const { headers } = await got( + `${baseUrl}badge/foo-bar-blue?logo=javascript`, + ) expect(headers['cache-control']).to.equal('max-age=86400, s-maxage=86400') }) From 7f7c8be1b65c8912207f7f84d4ce2ecddd7c0d9a Mon Sep 17 00:00:00 2001 From: chris48s Date: Wed, 24 Jul 2024 19:39:00 +0100 Subject: [PATCH 2/2] explaining cache-control header on redirects more clearly --- core/base-service/redirector.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/base-service/redirector.js b/core/base-service/redirector.js index 00dabed077153..2a1f6b0f984e6 100644 --- a/core/base-service/redirector.js +++ b/core/base-service/redirector.js @@ -111,8 +111,12 @@ export default function redirector(attrs) { ask.res.statusCode = 301 ask.res.setHeader('Location', redirectUrl) - // To avoid caching mistakes for a long time, and to make this simpler - // to reason about, use the same cache semantics as the static badge. + /* To avoid caching mistakes forever + (in the absence of cache control directives that specify otherwise, + 301 redirects are cached without any expiry date) + and to make this simpler to reason about, + use the same cache semantics as the static badge. + */ setCacheHeadersForStaticResource(ask.res) ask.res.end()