/**
* CloudFront Function injection code ported from SST's Router component.
* These are JavaScript code strings that get injected into CloudFront Function handlers.
*/
export const CF_BLOCK_CLOUDFRONT_URL_INJECTION = `
if (event.request.headers.host.value.includes('cloudfront.net')) {
return {
statusCode: 403,
statusDescription: 'Forbidden',
body: {
encoding: "text",
data: '
403 Forbidden403 Forbidden
'
}
};
}`;
const CLOUDFRONT_FUNCTION_SAFE_HEADER_LIMIT = 10240 - 512;
export const CF_ROUTER_INJECTION = `
async function routeSite(kvNamespace, metadata) {
var baselessUri = metadata.base
? event.request.uri.replace(metadata.base, "")
: event.request.uri;
try {
var u = decodeURIComponent(baselessUri);
var postfixes = u.endsWith("/")
? ["index.html"]
: ["", ".html", "/index.html"];
var v = await Promise.any(postfixes.map(function(p) { return cf.kvs().get(kvNamespace + ":" + u + p).then(function() { return p; }); }));
event.request.uri = metadata.s3.dir + event.request.uri + v;
setS3Origin(metadata.s3.domain);
return;
} catch (e) {}
if (metadata.s3 && metadata.s3.routes) {
for (var i=0, l=metadata.s3.routes.length; i ${CLOUDFRONT_FUNCTION_SAFE_HEADER_LIMIT};
}
function buildOversizedHeadersResponse() {
return {
statusCode: 431,
statusDescription: "Request Header Fields Too Large",
headers: { "cache-control": { value: "no-store" }, "content-type": { value: "text/plain; charset=utf-8" } },
body: { encoding: "text", data: "Request headers are too large. Reduce cookie size and try again." },
};
}
function getRequestHeaderSize() {
var size = 0;
for (var key in event.request.headers) {
var header = event.request.headers[key];
if (header.multiValue) {
for (var i=0; i