Skip to content

Instantly share code, notes, and snippets.

@andrewjjenkins
Last active August 29, 2015 14:18
Show Gist options
  • Save andrewjjenkins/fdbc404da507f9dc0c28 to your computer and use it in GitHub Desktop.
Save andrewjjenkins/fdbc404da507f9dc0c28 to your computer and use it in GitHub Desktop.
Infinite HTTPS server
var https = require('https');
var cluster = require('cluster');
var fs = require('fs');
var url = require('url');
var core2Dir = process.env.CORE2DIR || '/build/cayman/andrew/lrs_release/core2';
var port = process.env.PORT || 443;
var numCPUs = process.env.NUMCPUS || ('' + (require('os').cpus().length - 1));
numCPUs = parseInt(numCPUs);
var reqSize = process.env.REQSIZE || ('' + 1024*1024*1024);
reqSize = parseInt(reqSize);
var cert, key;
if (process.env.CERT) {
cert = fs.readFileSync(process.env.CERT);
} else {
cert = fs.readFileSync(core2Dir + '/libs/unittest/keys/rsa-2048-cert.pem');
}
if (process.env.KEY) {
key = fs.readFileSync(process.env.KEY);
} else {
key = fs.readFileSync(core2Dir + '/libs/unittest/keys/rsa-2048-key.pem');
}
var genericBlob = (new Array(10240 + 1)).join('0123456789');
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
makeServer();
}
function handleGetRequest(req, res) {
var size = reqSize;
var reqUrl = url.parse(req.url, true);
var bytesSent = 0;
try {
if (req.headers['X-Size']) {
size = parseInt(req.headers['X-Size']);
} else if (reqUrl.pathname === '/size') {
size = parseInt(reqUrl.query.bytes);
}
} catch (e) {
console.log('Failed to get the size from a request, defaulting to %d',
reqSize);
}
function sendMoreStuffIfNeeded() {
if (bytesSent >= size) {
console.log('Response done, bytesSent: ', bytesSent);
res.end();
return;
}
var didDrain = res.write(genericBlob);
if (didDrain) {
if (setImmediate) {
setImmediate(sendMoreStuffIfNeeded);
} else {
process.nextTick(sendMoreStuffIfNeeded);
}
} else {
res.once('drain', sendMoreStuffIfNeeded);
}
bytesSent += genericBlob.length;
}
sendMoreStuffIfNeeded();
}
function handlePostRequest(req, res) {
var reqSize = 0;
req.on('data', function (d) {
//console.log('Server got a data chunk of %d bytes', d.length);
reqSize += d.length;
});
req.on('end', function () {
var body = 'Request done, ' + reqSize + ' bytes total';
console.log(body);
res.writeHead(
200,
{ 'Content-Type': 'text/plain',
'Content-Length': body.length });
res.end(body);
});
}
function makeServer() {
var server = https.createServer({
key: key,
cert: cert,
}, function (req, res) {
if (req.method === 'GET') {
return handleGetRequest(req, res);
} else if (req.method === 'POST' || req.method === 'PUT') {
return handlePostRequest(req, res);
} else {
// unsupported
req.resume(); res.end();
return;
}
}).listen(port, function () {
console.log('Infinite server PID %d listening on port %d', process.pid,
port);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment