From e6c53ad59014621783541aee3144c58e8de51cbd Mon Sep 17 00:00:00 2001 From: Roman Shtylman Date: Mon, 18 Jun 2012 15:40:23 -0400 Subject: [PATCH] allow client to request previous id for reuse --- client.js | 9 ++++++++- server.js | 44 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/client.js b/client.js index e2e5ade..dc0a077 100644 --- a/client.js +++ b/client.js @@ -27,12 +27,15 @@ var opt = { json: true }; -opt.uri = 'http://' + opt.host + ':' + opt.port + opt.path; +var base_uri = 'http://' + opt.host + ':' + opt.port + opt.path; var internal; var upstream; +var prev_id; (function connect_proxy() { + opt.uri = base_uri + ((prev_id) ? prev_id : ''); + request(opt, function(err, res, body) { if (err) { console.error('upstream not available: %s', err.message); @@ -43,6 +46,9 @@ var upstream; var port = body.port; var host = opt.host; + // store the id so we can try to get the same one + prev_id = body.id; + console.log('your url is: %s', body.url); // connect to remote tcp server @@ -52,6 +58,7 @@ var upstream; connect_internal(); upstream.on('end', function() { + console.log('> upstream connection terminated'); // sever connection to internal server // on reconnect we will re-establish diff --git a/server.js b/server.js index b30ee9f..51c5db1 100644 --- a/server.js +++ b/server.js @@ -4,6 +4,19 @@ var http = require('http'); var net = require('net'); var FreeList = require('freelist').FreeList; +var argv = require('optimist') + .usage('Usage: $0 --port [num]') + .options('port', { + default: '80', + describe: 'listen on this port for outside requests' + }) + .argv; + +if (argv.help) { + require('optimist').showHelp(); + process.exit(); +} + // here be dragons var HTTPParser = process.binding('http_parser').HTTPParser; var ServerResponse = http.ServerResponse; @@ -230,9 +243,30 @@ server.on('connection', function(socket) { server.on('request', function(req, res) { - // generate new shit for client - var id = rand_id(); + // ignore favicon + if (req.url === '/favicon.ico') { + res.writeHead(404); + return res.end(); + } + var match = req.url.match(/\/([a-z]{4})?/); + + // user can request a particular set of characters + // will be given if not already taken + // this is useful when the main server is restarted + // users can keep testing with their expected ids + var requested_id; + if (match && match[1]) { + requested_id = match[1]; + } + + var id = requested_id || rand_id(); + if (wait_list[id]) { + // new id + id = rand_id(); + } + + // generate new shit for client if (wait_list[id]) { wait_list[id].forEach(function(waiting) { waiting.end(); @@ -247,7 +281,7 @@ server.on('request', function(req, res) { var url = 'http://' + id + '.' + req.headers.host; res.writeHead(200, { 'Content-Type': 'application/json' }); - res.end(JSON.stringify({ url: url, port: port })); + res.end(JSON.stringify({ url: url, id: id, port: port })); }); // user has 5 seconds to connect before their slot is given up @@ -279,5 +313,7 @@ server.on('request', function(req, res) { }); }); -server.listen(8000); +server.listen(argv.port, function() { + log.info('server listening on port: %d', server.address().port); +});