icloudtweetdeckhipchattelegramhangoutsslackgmailskypefacebook-workplaceoutlookemailmicrosoft-teamsdiscordmessengercustom-servicesmacoslinuxwindowsinboxwhatsapp
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.9 KiB
114 lines
3.9 KiB
var http = require('http'); |
|
var qs = require('querystring'); |
|
var fs = require('fs'); |
|
var spawn = require('child_process').spawn; |
|
|
|
var helpers = require('./helpers.js'); |
|
var v1 = require('./converters/v1.js'); |
|
var v2 = require('./converters/v2.js'); |
|
|
|
|
|
var MAX_FILE_SIZE = 5 * 1024 * 1024; |
|
var TMP_DIR_NAME = process.cwd() + '/' + 'tmp/'; |
|
var SCRIPT = fs.readFileSync('./save_script_tpl.js', { encoding: 'utf8' }); |
|
|
|
if (!fs.existsSync(TMP_DIR_NAME)) { |
|
fs.mkdirSync(TMP_DIR_NAME); |
|
} |
|
|
|
var defaultHeaders = { |
|
'Content-Type': 'text/plain', |
|
'Access-Control-Allow-Origin': '*' |
|
}; |
|
|
|
function respond(response, code, data, headers) { |
|
headers = helpers.apply({}, headers, defaultHeaders); |
|
response.writeHead(code, headers); |
|
response.end(data); |
|
} |
|
|
|
var counter = (function () { |
|
var value = 0, |
|
max_int = Math.pow(2, 32) - 1; |
|
return function () { |
|
if (value > max_int) { |
|
value = 0; |
|
} |
|
return value++; |
|
} |
|
})(); |
|
|
|
http.createServer(function (request, response) { |
|
if (request.method === 'POST') { |
|
var body = ''; |
|
request.on('data', function (data) { |
|
if (body.length <= MAX_FILE_SIZE) { |
|
body += data; |
|
} else { |
|
respond(response, 413, "Request entity too large."); |
|
} |
|
}); |
|
request.on('end', function () { |
|
try { |
|
var config = qs.parse(body); |
|
} catch (e) { |
|
console.error("Parsing request data failed.", e); |
|
} |
|
|
|
if (config) { |
|
switch (config.version) { |
|
case '2': |
|
config = v2.convert(config); |
|
break; |
|
default: |
|
config = v1.convert(config); |
|
break; |
|
} |
|
} |
|
|
|
if (!config || !config.data) { |
|
respond(response, 400, "Bad request."); |
|
return; |
|
} |
|
|
|
var userFileName = (config.filename || 'chart') + '.' + config.format; |
|
var serverFileName = TMP_DIR_NAME + counter().toString() + '.' + config.format; |
|
var scriptFileName = TMP_DIR_NAME + counter().toString() + '.js'; |
|
|
|
var script = helpers.interpolate(SCRIPT, helpers.apply(config, { |
|
filename: serverFileName |
|
})); |
|
|
|
fs.writeFile(scriptFileName, script, { encoding: 'utf8' }, function (err) { |
|
if (err) throw err; |
|
|
|
var phantom = spawn('phantomjs', [scriptFileName]); |
|
phantom.stdout.pipe(process.stdout); // proxy console output from phantom to node |
|
phantom.on('exit', function (code) { |
|
fs.unlink(scriptFileName, function () { |
|
if (err) throw err; |
|
console.log("Successfully deleted:", scriptFileName); |
|
}); |
|
if (!code) { |
|
fs.readFile(serverFileName, function (err, data) { |
|
if (err) throw err; |
|
respond(response, 200, data, { |
|
'Content-Type': config.contentType, |
|
'Content-Disposition': 'attachment; filename=' + userFileName |
|
}); |
|
fs.unlink(serverFileName, function () { |
|
if (err) throw err; |
|
console.log("Successfully deleted:", serverFileName); |
|
}); |
|
}); |
|
} else { |
|
respond(response, 500, "Internal server error.\n" + |
|
"phantomjs exited with code " + code); |
|
} |
|
}); |
|
}); |
|
}); |
|
} else { |
|
respond(response, 400, "Bad request."); |
|
} |
|
}).listen(1337, '0.0.0.0');
|
|
|