ancillary-http
Version:
A library that allows you to move incoming http request to other, unrelated processes using the module 'ancillary'
79 lines (57 loc) • 1.85 kB
JavaScript
var spdy = require("spdy");
var fs = require("fs");
var net = require("net");
var anc = require("ancillary");
var anchttp = require("./index.js");
var httpjs = require("http.js");
var crypto = require("crypto");
function md5(data){
var hash = crypto.createHash("md5");
hash.update(data,"utf8");
return hash.digest("hex");
}
module.exports = function(port,opts,target){
var serverpath = "/tmp/"+md5(__filename+":"+port);
try{
fs.unlinkSync(serverpath);
}catch(e){}
var server = net.createServer({allowHalfOpen:true},function(c){
anc.send(target,c);
}).listen(serverpath);
var s = spdy.createServer(opts,handle);
function handle(req,res,sock){
var c = net.connect(serverpath,function(){
req.headers.connection = "Close";
var header = req.method+" "+req.url+" HTTP/1.1\r\n";
for(var h in req.headers){
header += h+": "+req.headers[h]+"\r\n";
}
header += "\r\n";
c.write(header);
(sock?sock:req).pipe(c);
var res2 = new httpjs.httpParser(c,false);
var open = false;
res2.on("open",function(){
open = true;
res.writeHead(res2.statusCode,res2.statusMessage,res2.headers);
res2.on("data",function(d){
res.write(d);
});
res2.on("close",function(){
res.end();
});
});
res2.on("close",function(){
if(!open){
res.writeHead(404,"Not found");
res.end();
}
});
});
}
s.on("upgrade",function(req,sock,data){
var res = new httpjs.httpResponse(sock);
handle(req,res,sock);
});
s.listen(port);
}