/** * 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 Forbidden

403 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