fastcgi-parser
Version:
FastCGI parser for low level parsing of the FastCGI protocol
95 lines (83 loc) • 2.42 kB
JavaScript
#!/usr/local/bin/node
var util = require('util');
var fs = require("fs");
var IOWatcher = process.binding('io_watcher').IOWatcher;
var net = require("net");
var fastcgi = require("../lib/fastcgi");
var log = fs.createWriteStream("/tmp/responder.log", {
"flags": "w",
"encoding": null,
"mode": 0777
});
process.on('uncaughtException', function (err) {
log.write('Caught exception: ' + JSON.stringify(err, null, "\t") + "\n");
});
var output = new Buffer("HTTP/1.1 200 OK\r\nContent-Length: 10\r\nContent-Type: text/plain\r\n\r\n0123456789");
watcher = new IOWatcher();
watcher.callback = function() {
var peerInfo = process.binding('net').accept(0);
clientfd = peerInfo.fd;
var s = new net.Stream(clientfd);
var parser = new fastcgi.parser();
parser.encoding = "binary";
var writer = new fastcgi.writer();
writer.encoding = "binary";
var header = {
"version": fastcgi.constants.version,
"type": fastcgi.constants.record.FCGI_STDOUT,
"recordId": 0,
"contentLength": 0,
"paddingLength": 0
};
var end = {
"status": 0,
"protocolStatus": 200
};
var plen = output.length;
parser.onError = function(exception) {
log.write(JSON.stringify(exception, null, "\t"));
};
parser.onRecord = function(record) {
recordId = record.header.recordId;
header.recordId = recordId;
switch(record.header.type) {
case fastcgi.constants.record.FCGI_BEGIN:
s.keepalive = (record.body.flags == 1);
break;
case fastcgi.constants.record.FCGI_PARAMS:
break;
case fastcgi.constants.record.FCGI_STDIN:
if(record.header.contentLength == 0) {
header.type = fastcgi.constants.record.FCGI_STDOUT;
header.contentLength = plen;
writer.writeHeader(header);
writer.writeBody(output);
s.write(writer.tobuffer());
header.contentLength = 0;
writer.writeHeader(header);
s.write(writer.tobuffer());
header.type = fastcgi.constants.record.FCGI_END;
header.contentLength = 8;
writer.writeHeader(header);
writer.writeEnd(end);
s.write(writer.tobuffer());
if(!s.keepalive) {
s.end();
}
}
break;
}
};
s.ondata = function (buffer, start, end) {
parser.execute(buffer, start, end);
};
s.on("end", function() {
//log.write("end\n");
});
s.on("close", function(had_error) {
//log.write("close\n");
});
s.resume();
};
watcher.set(0, true, false); // read=true, write=false
watcher.start();