Skip to content
This repository has been archived by the owner on Feb 25, 2020. It is now read-only.

Commit

Permalink
#71 server-side support
Browse files Browse the repository at this point in the history
  • Loading branch information
alexlamsl committed May 20, 2014
1 parent ae127fb commit 57daddc
Showing 1 changed file with 25 additions and 6 deletions.
31 changes: 25 additions & 6 deletions lib/httpserver.js
Expand Up @@ -2,11 +2,12 @@
* @fileoverview HTTP server interface as defined in [CommonJS JSGI
* 0.3](http://wiki.commonjs.org/wiki/JSGI/Level0/A/Draft2).
*/
require('fibers');
var Fiber = require('fibers');
var fs = require('fs').read;
var parse = require('url').parse;
var http = require('http');
var https = require('https');
var zlib = require('zlib');
var cluster = require('cluster');
var cpus = require('os').cpus().length;
var system = require('./system');
Expand Down Expand Up @@ -69,16 +70,32 @@ function receive(request) {
};
}

function send(r, response) {
function send(r, response, compress) {
var body = r.body;
var headers = r.headers || {};
if (compress) {
headers['Content-Encoding'] = 'gzip';
}
response.writeHead(r.status, headers);
var charset = getCharset(headers);
body.forEach(function(part) {
if (!(part instanceof Binary)) {
part = part.toByteString(charset);
}
response.write(part.buffer);
if (compress) {
var waiting = Fiber.current;
zlib.gzip(part.buffer, function(err, buffer) {
if (err) {
waiting.throwInto(err);
} else {
response.write(buffer);
waiting.run();
}
});
Fiber.yield();
} else {
response.write(part.buffer);
}
});
if (body.close) {
body.close();
Expand All @@ -90,7 +107,7 @@ var jsgi = exports.jsgi = function(app) {
return function(request, response) {
system.spawn(function() {
try {
send(app(receive(request)), response);
send(app(receive(request)), response, ~(request.headers['accept-encoding'] || []).indexOf('gzip'));
} catch (e) {
console.error(e.stack);
send({status:503, body:[], headers:{}}, response);
Expand All @@ -103,7 +120,9 @@ var jsgi = exports.jsgi = function(app) {
exports.started = false;
var main = exports.main = function(module, port, options) {
if (cluster.isMaster && options && options.cluster) {
if(options.cluster == 0) options.cluster = cpus;
if (options.cluster === 0) {
options.cluster = cpus;
}
for (var i = 0; i < options.cluster; i++) {
cluster.fork(process.env);
}
Expand All @@ -129,4 +148,4 @@ var main = exports.main = function(module, port, options) {
server.listen(port);
exports.started = true;
}
};
};

0 comments on commit 57daddc

Please sign in to comment.