-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathviewreq.ts
More file actions
60 lines (51 loc) · 1.71 KB
/
viewreq.ts
File metadata and controls
60 lines (51 loc) · 1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Handle /go/prospectus language redirect for rubykaigi.org
// Returns Response if redirect needed, null otherwise
function handleProspectusRedirect(
request: AWSCloudFrontFunction.Request,
): AWSCloudFrontFunction.Response | null {
const host = request.headers["host"]?.value;
if (host !== "rubykaigi.org" || request.uri !== "/go/prospectus") {
return null;
}
const country = request.headers["cloudfront-viewer-country"]?.value;
const acceptLang = request.headers["accept-language"]?.value || "";
const lang = (country === "JP" || acceptLang.toLowerCase().includes("ja"))
? "ja"
: "en";
// Build query string preserving original
const qs = Object.keys(request.querystring)
.map(k => {
const v = request.querystring[k];
return v.value ? `${k}=${v.value}` : k;
})
.join("&");
const location = `/go/prospectus-${lang}${qs ? "?" + qs : ""}`;
return {
statusCode: 302,
statusDescription: "Found",
headers: {
location: { value: location },
},
};
}
// Set x-rko-host and x-rko-xfp headers for backend routing
function setRkoHeaders(request: AWSCloudFrontFunction.Request): void {
request.headers["x-rko-host"] = request.headers["host"];
const fp = request.headers["cloudfront-forwarded-proto"]?.value;
if (fp === "https" || fp === "HTTPS") {
request.headers["x-rko-xfp"] = { value: "https" };
} else {
request.headers["x-rko-xfp"] = { value: "http" };
}
}
function handler(
event: AWSCloudFrontFunction.Event,
): AWSCloudFrontFunction.Request | AWSCloudFrontFunction.Response {
const { request } = event;
const redirect = handleProspectusRedirect(request);
if (redirect) {
return redirect;
}
setRkoHeaders(request);
return request;
}