in core/nodejsActionBase/platform/knative.js [274:367]
function postProcessResponse(req, result, res) {
var content_types = {
json: 'application/json',
html: 'text/html',
png: 'image/png',
svg: 'image/svg+xml',
};
// After getting the result back from an action, update the HTTP headers,
// status code, and body based on its result if it includes one or more of the
// following as top level JSON properties: headers, statusCode, body
let statusCode = result.code;
let headers = {};
let body = result.response;
let contentTypeInHeader = false;
// statusCode: default is 200 OK if body is not empty otherwise 204 No Content
if (result.response.statusCode !== undefined) {
statusCode = result.response.statusCode;
delete body['statusCode'];
}
// the default content-type for an HTTP response is application/json
// this default are overwritten with the action specified headers
if (result.response.headers !== undefined) {
headers = result.response.headers;
delete body['headers'];
}
// addressing content-type v/s Content-Type
// marking 'Content-Type' as standard inside header
if (headers.hasOwnProperty(CONTENT_TYPE.toLowerCase())) {
headers[CONTENT_TYPE] = headers[CONTENT_TYPE.toLowerCase()];
delete headers[CONTENT_TYPE.toLowerCase()];
}
// If a content-type header is not declared in the action result’s headers,
// the body is interpreted as application/json for non-string values,
// and text/html otherwise.
if (!headers.hasOwnProperty(CONTENT_TYPE)) {
if (result.response.body !== undefined && typeof result.response.body == "string") {
headers[CONTENT_TYPE] = content_types.html;
} else {
headers[CONTENT_TYPE] = content_types.json;
}
} else {
contentTypeInHeader = true;
}
// body: a string which is either a plain text, JSON object, or a base64 encoded string for binary data (default is "")
// body is considered empty if it is null, "", or undefined
if (result.response.body !== undefined) {
body = result.response.body;
delete body['main'];
delete body['code'];
delete body['binary'];
}
// When the content-type is defined, check if the response is binary data or
// plain text and decode the plain text using a base64 decoder whenever needed.
// Should the body fail to decoded correctly, return an error to the caller.
if (contentTypeInHeader && headers[CONTENT_TYPE].lastIndexOf("image", 0) === 0) {
if (typeof body === "string") {
body = Buffer.from(body, 'base64')
headers["Content-Transfer-Encoding"] = "binary";
}
// TODO: throw an error if body can not be decoded
}
// statusCode: set it to 204 No Content if body is empty
if (statusCode === 200 && body === "") {
statusCode = 204;
}
if (!headers.hasOwnProperty('Access-Control-Allow-Origin')) {
headers['Access-Control-Allow-Origin'] = '*';
}
if (!headers.hasOwnProperty('Access-Control-Allow-Methods')) {
headers['Access-Control-Allow-Methods'] = 'OPTIONS, GET, DELETE, POST, PUT, HEAD, PATCH';
}
// the header Access-Control-Request-Headers is echoed back as the header Access-Control-Allow-Headers if it is present in the HTTP request.
// Otherwise, a default value is generated.
if (!headers.hasOwnProperty['Access-Control-Allow-Headers']) {
headers['Access-Control-Allow-Headers'] = 'Authorization, Origin, X - Requested - With, Content - Type, Accept, User - Agent';
if (typeof req.headers['Access-Control-Request-Headers'] !== "undefined") {
headers['Access-Control-Allow-Headers'] = req.headers['Access-Control-Request-Headers'];
}
}
res.header(headers).status(statusCode).send(body);
}