Last active
August 29, 2015 14:18
-
-
Save andrewjjenkins/fdbc404da507f9dc0c28 to your computer and use it in GitHub Desktop.
Infinite HTTPS server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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