enhancer-data-bridge
Version:
A bridge between Enhancer Clould and user business datasource
80 lines (70 loc) • 2.5 kB
JavaScript
var logger = require('log4js').getLogger('io');
var request = require('request');
var pattern = {
variableAndIdentifier: /(@(\d+-)?\w+(\.\w+)*@)|(\$(\d+-)?\w+(\.\w+)*\$)/g,
variable: /@(\d+-)?\w+(\.\w+)*@/g,
clientVariable: /(@\d+-\w+(\.\w+)*@)|(\$\d+-\w+(\.\w+)*\$)/g,
identifier: /\$(\d+-)?\w+(\.\w+)*\$/g
};
module.exports = {
request: function(req, res, next) {
// mock server vars for user debug
var serverVars = req.body.serverVars;
try {
serverVars = JSON.parse(decodeURIComponent(serverVars));
} catch(e) {
serverVars = {};
}
var criteria;
try {
criteria = JSON.parse(req.body.criteria);
} catch (e) {
return res.end('Invalid criteria');
}
// merge
var params = criteria.params || {};
for (var i in serverVars) {
params[i.toUpperCase()] = serverVars[i];
}
var options = JSON.parse(req.body.httpOptions);
if (!options.url) {
return res.end('Invalid http proxy url');
}
options.url = options.url.replace(pattern.variableAndIdentifier, function(s) {
var name = s.split(/\@|\$/)[1].toUpperCase();
var val = params[name];
if (typeof val === 'object') {
return encodeURIComponent(JSON.stringify(val));
}
return encodeURIComponent(val);
});
options.bodyContent = options.bodyContent.replace(pattern.variableAndIdentifier, function(s) {
var name = s.split(/\@|\$/)[1].toUpperCase();
return options.contentType === 'application/json'
? JSON.stringify(params[name])
: encodeURIComponent(params[name]);
});
request({
url: options.url,
method: options.requestMethod,
headers: {
'Cookie': options.mockCookie,
'Content-Type': options.contentType
},
body: options.bodyContent,
timeout: 3000,
callback: function(err, res0) {
if (err) {
return res.jsonp({
success: false,
message: err.message
});
}
res.jsonp({
success: true,
data: res0.body
});
}
});
}
};