-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhandlerOriginResponse.js
More file actions
116 lines (99 loc) · 3.22 KB
/
handlerOriginResponse.js
File metadata and controls
116 lines (99 loc) · 3.22 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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
"use strict";
const helpers = require("./helpers/misc");
const http_helpers = require("./helpers/http");
require("source-map-support").install();
module.exports.originResponse = async (event) => {
let response = event.Records[0].cf.response;
try {
let APIDomain;
let crowdhandlerResponseID;
let crowdhandlerToken;
let publicKey;
let requestTime;
// Infer useful information from the request event and save it
let request = event.Records[0].cf.request;
const requestHeaders = request.headers;
const uri = request.uri;
// Don't try and queue static assets
let fileExtension = uri.split(".").pop();
// No need to execute anymore of this script if the request is for a static file.
const creativeAssetExtensions = helpers.creativeAssetExtensions;
if (creativeAssetExtensions.indexOf(fileExtension) !== -1) {
return response;
}
// Environment Setup
(function () {
// Guard against the crowdhandlerResponseID value coming back null from the API
try {
if (requestHeaders["x-ch-responseid"]) {
crowdhandlerResponseID = requestHeaders["x-ch-responseid"][0].value;
}
} catch (error) {
console.error(error);
}
// Handle lack of valid token i.e. partial API responses for unprotected rooms.
try {
//Make sure we don't set invalid values
const validToken = /(.*\d+.*)/;
if (
requestHeaders["x-ch-crowdhandler-token"] &&
validToken.test(requestHeaders["x-ch-crowdhandler-token"][0].value) ===
true
) {
crowdhandlerToken = requestHeaders["x-ch-crowdhandler-token"][0].value;
}
} catch (error) {
console.error(error);
return response;
}
APIDomain = requestHeaders["x-ch-api-endpoint"]?.[0]?.value;
publicKey = requestHeaders["x-ch-public-key"]?.[0]?.value;
requestTime = requestHeaders["x-ch-request-time"]?.[0]?.value;
})();
// If we don't have required headers or a valid crowdhandlerToken, return response early.
if (!crowdhandlerToken || !APIDomain || !publicKey || !requestTime) {
return response;
}
// Requested Domain
const host = requestHeaders.host[0].value;
// Cookies now set in viewer-response (fires on cached responses too)
const totalLoadTime = Date.now() - requestTime;
async function sendPageLoadTime() {
let response;
try {
response = await http_helpers.httpPUT(
{
hostname: APIDomain,
port: 443,
path: `/v1/responses/${crowdhandlerResponseID}`,
method: "PUT",
headers: {
"x-api-key": publicKey,
"Content-Type": "application/json",
},
},
JSON.stringify({
httpCode: 200,
sampleRate: 10,
time: totalLoadTime,
})
);
} catch (error) {
console.error(error);
}
}
// We don't want to send page performance information on every request so sampling is used.
const sampleRate = Math.floor(Math.random() * 10);
if (sampleRate === 9) {
try {
await sendPageLoadTime();
} catch (error) {
console.error(error);
}
}
return response;
} catch (error) {
console.error('[CH] Unhandled error in originResponse - failing open:', error);
return response;
}
};