Skip to content

Instantly share code, notes, and snippets.

@shimondoodkin
Created March 12, 2013 12:53
Show Gist options
  • Save shimondoodkin/5142644 to your computer and use it in GitHub Desktop.
Save shimondoodkin/5142644 to your computer and use it in GitHub Desktop.
node.js reverse proxy at end of express. to make post commands work must remove bodyparser and mothod override. use body parser as middleware of app.get command.
// this is not a main file the main file is opchart.js
var express = require('express')
// , routes = require('./routes')
// , user = require('./routes/user')
, path = require('path');
sessionStore=false //defined on first time it could be catched from a request
app = express();//global
// User validation
var auth = express.basicAuth(function(user, pass) {
return (user=="test"&&pass=="test") ? true : false;
},'Secret Area');
var httpProxy = require('http-proxy');
var proxy = new httpProxy.RoutingProxy({
enable : {
xforward: true // enables X-Forwarded-For
}
});
// the idea behind user id , that it is like session id ...
// it is usualy if you like to interact between connected users you would share all the session ids of all users to all users in the room
// when you expose session id someone can use it on other side which is a security risk
// so it is another temporary id but without a security risk
function session_adduserid(req,res,next){
if(!req.session.userid)
{
req.session.userid=require('express/node_modules/connect/lib/utils').uid(24);// expose user's session it is unsecure lets have another id
userid_to_sessionid[req.session.userid]=req.sessionID;
}
if(!sessionStore)sessionStore=req.sessions;
req.session.lasttouch=new Date().getTime();
next();
}
function session_userid_manager()
{
var ks=Object.keys(userid_to_sessionid),userid,sessionID,session;
var expire_at=new Date();
// console.log(expire_at.getTime())
expire_at.setMinutes(expire_at.getMinutes()-30);
expire_at=expire_at.getTime();
for(i =0;i<ks.length;i++)
{
userid=ks[i];
sessionID=userid_to_sessionid[userid];
session=sessionStore[sessionID];
if(!session) delete userid_to_sessionid[userid];
else if(session.lasttouch<expire_at)
{
//console.log('delete expired sessionID '+sessionID);
delete sessionStore[sessionID];
delete userid_to_sessionid[userid];
}
}
//console.log('sessions ',sessionStore);
}
userid_to_sessionid={};//global
//var sesame=require('sesame');
//app.configure(function(){
app.disable('x-powered-by');
app.set('port', process.env.PORT || 80);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
//app.use(express.logger('dev'));
app.use(express.cookieParser());
//var sessionStore=new express.session.MemoryStore();//http://nodetoolbox.com/packages/mysql-session-store
app.use(require('sesame')({ /*store: sessionStore ,*/ secret: 'secret' , key: 'express.sid', /*maxAge :24*3600000 //1 Hour * 24*/ }));
app.use(session_adduserid);
setInterval(session_userid_manager,1*60*1000);// once a minute clear old userids
/*
app.all('/', function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Origin, X-File-Name, Content-Type, Cache-Control");
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
next();
});
*/
bodyParser=express.bodyParser()
//app.use(bodyParser);
//app.use(require('connect-restreamer')());
//app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
//});
app.use(function(req, res) { // reverse proxyhere
proxy.proxyRequest(req, res, {
host: '127.0.0.1',
port: 8000
});
});
//app.configure('development', function(){
app.use(express.errorHandler());
//});
var gif_1x1_buffer = new Buffer("R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==", encoding='base64');// Store imageData buffer 1x1 pixel transparent gif file
app.get('/keepsession.gif', function(req,res){
res.writeHead(200,
{
'Cache-Control': 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0',
'Pragma': 'no-cache',
'Expires':"Tue, 01 Jan 2000 12:12:12 GMT",
'Content-Type': 'image/gif'
});
res.write(gif_1x1_buffer.toString('binary'), 'binary');
res.end();
if(!req.session)console.log("session is undefined")
else req.session.lasttouch=new Date().getTime()
});
// view session (for development)
app.get('/s', function(req,res){
//console.log(req);
res.writeHead(200,
{
'Cache-Control': 'no-cache',
'Pragma': 'no-cache',
'Content-Type': 'text/html',
'Expires':"Tue, 01 Jan 2000 12:12:12 GMT"
});
res.end("sessionid="+req.sessionID+' session='+JSON.stringify(req.session));
});
//app.get('/', routes.index);
//app.get('/users', user.list);
//module.exports=app;
@aryeharmon
Copy link

So what you did is remove bodyParser? that's not a good solution.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment