Skip to content

Commit 93395ec

Browse files
committed
add cdn tags
1 parent a29330e commit 93395ec

File tree

4 files changed

+69
-6
lines changed

4 files changed

+69
-6
lines changed

src/controllers/cdnController.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ export const proxyReportsFile = async (req, res, filePath) => {
6363
// Set response headers
6464
res.setHeader('Content-Type', contentType);
6565
res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');
66+
res.setHeader('Cloud-CDN-Cache-Tag', 'bucket-proxy');
67+
// Browser cache: 1 hour, CDN cache: 30 days
68+
res.setHeader('Cache-Control', 'public, max-age=3600, s-maxage=2592000');
6669

6770
if (metadata.etag) {
6871
res.setHeader('ETag', metadata.etag);

src/index.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ const setCORSHeaders = (res) => {
6262
const setCommonHeaders = (res) => {
6363
setCORSHeaders(res);
6464
res.setHeader('Content-Type', 'application/json');
65-
res.setHeader('Cache-Control', 'public, max-age=21600');
65+
// Browser cache: 1 hour, CDN cache: 30 days
66+
res.setHeader('Cache-Control', 'public, max-age=3600, s-maxage=2592000');
67+
res.setHeader('Cloud-CDN-Cache-Tag', 'report-api');
6668
res.setHeader('Timing-Allow-Origin', '*');
6769
};
6870

@@ -99,8 +101,8 @@ const handleRequest = async (req, res) => {
99101
return;
100102
}
101103

102-
// Parse URL path
103-
const pathname = req.path;
104+
// Parse URL path - robustly handle Express (req.path) or native Node (req.url)
105+
const pathname = req.path || req.url.split('?')[0];
104106

105107
// Route handling
106108
if (pathname === '/' && req.method === 'GET') {

src/tests/headers.test.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { jest, describe, it, expect, beforeAll } from '@jest/globals';
2+
3+
// Define mocks BEFORE importing the app
4+
jest.unstable_mockModule('../controllers/technologiesController.js', () => ({
5+
listTechnologies: jest.fn((req, res) => {
6+
res.setHeader('Content-Type', 'application/json');
7+
res.end(JSON.stringify({ data: [] }));
8+
})
9+
}));
10+
11+
jest.unstable_mockModule('../controllers/cdnController.js', () => ({
12+
proxyReportsFile: jest.fn((req, res) => {
13+
res.setHeader('Content-Type', 'application/json');
14+
res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');
15+
res.setHeader('Cloud-CDN-Cache-Tag', 'bucket-proxy');
16+
res.setHeader('Cache-Control', 'public, max-age=3600, s-maxage=2592000');
17+
res.statusCode = 200;
18+
res.end(JSON.stringify({ mocked: true }));
19+
})
20+
}));
21+
22+
let request;
23+
let app;
24+
25+
describe('CDN Headers', () => {
26+
beforeAll(async () => {
27+
// Import supertest and app AFTER mocking
28+
request = (await import('supertest')).default;
29+
const module = await import('../index.js');
30+
app = module.app;
31+
});
32+
33+
it('should set correct headers for standard API endpoints', async () => {
34+
const res = await request(app).get('/v1/technologies');
35+
36+
expect(res.statusCode).toEqual(200);
37+
expect(res.headers['cache-control']).toBe('public, max-age=3600, s-maxage=2592000');
38+
expect(res.headers['cloud-cdn-cache-tag']).toBe('report-api');
39+
expect(res.headers['access-control-allow-origin']).toBe('*');
40+
});
41+
42+
it('should set correct headers for static file proxy', async () => {
43+
const res = await request(app).get('/v1/static/test.json');
44+
45+
expect(res.statusCode).toEqual(200);
46+
expect(res.headers['cache-control']).toBe('public, max-age=3600, s-maxage=2592000');
47+
expect(res.headers['cloud-cdn-cache-tag']).toBe('bucket-proxy');
48+
expect(res.headers['cross-origin-resource-policy']).toBe('cross-origin');
49+
});
50+
51+
it('should set correct headers for health check', async () => {
52+
const res = await request(app).get('/');
53+
54+
expect(res.statusCode).toEqual(200);
55+
expect(res.headers['cache-control']).toBe('public, max-age=3600, s-maxage=2592000');
56+
expect(res.headers['cloud-cdn-cache-tag']).toBe('report-api');
57+
});
58+
});

terraform/modules/cdn-glb/variables.tf

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ variable "enable_cdn" {
3838
variable "cdn_cache_mode" {
3939
description = "CDN cache mode (CACHE_ALL_STATIC, USE_ORIGIN_HEADERS, FORCE_CACHE_ALL)"
4040
type = string
41-
default = "CACHE_ALL_STATIC"
41+
default = "USE_ORIGIN_HEADERS"
4242
}
4343
variable "cdn_default_ttl" {
4444
description = "Default TTL for cached content in seconds"
@@ -53,12 +53,12 @@ variable "cdn_max_ttl" {
5353
variable "cdn_client_ttl" {
5454
description = "Client TTL for cached content in seconds (browser cache)"
5555
type = number
56-
default = 28800 # 8 hours
56+
default = 3600 # 1 hour
5757
}
5858
variable "cdn_serve_while_stale" {
5959
description = "Time to serve stale content while revalidating in seconds"
6060
type = number
61-
default = 0
61+
default = 86400 # 24 hours
6262
}
6363
variable "cdn_negative_caching" {
6464
description = "Whether to enable negative caching"

0 commit comments

Comments
 (0)