From e0bd4306d7f2284058b0f0910cf4e84e7c78b4f9 Mon Sep 17 00:00:00 2001 From: tv Date: Sun, 5 Jan 2014 23:05:11 +0100 Subject: go: initial commit (the real one) --- go/index.js | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 go/index.js (limited to 'go/index.js') diff --git a/go/index.js b/go/index.js new file mode 100644 index 00000000..723fb78a --- /dev/null +++ b/go/index.js @@ -0,0 +1,83 @@ +var httpPort = process.env.PORT || 1337; +var redisPrefix = 'go:'; + +var http = require('http'); +var formidable = require('formidable'); +var redis = require('redis'); + +var redisClient = redis.createClient(); +var httpServer = http.createServer(listener); + +redisClient.on('error', function (err) { + console.log('redis made a bubu:', err.message); + process.exit(23); +}); +httpServer.listen(httpPort, function () { + console.log('http server listening on port', httpPort); +}); + +function listener (req, res) { + if (req.method === 'POST' && req.url === '/') { + return create(req, res); + } else if (req.method === 'GET') { + return retrieve(req, res); + } else { + return methodNotAllowed(req, res); + } +} + +function create (req, res) { + redisClient.incr(redisPrefix + 'index', function (err, reply) { + if (err) { + return internalError(err, req, res); + } + + var form = new formidable.IncomingForm(); + + form.parse(req, function(err, fields, files) { + if (err) { + return internalError(err, req, res); + } + + var uri = fields.uri; + // TODO check uri(?) + var shortUri = '/' + reply; + var key = redisPrefix + shortUri; + + redisClient.set(key, uri, function (error) { + if (error) { + return internalError(err, req, res); + } + + res.writeHead(200, { 'content-type': 'text/plain' }); + return res.end(shortUri + '\r\n'); + }); + }); + }); +} + +function retrieve (req, res) { + var key = redisPrefix + req.url; + redisClient.get(key, function (error, reply) { + if (error) { + return internalError(err, req, res); + } + + if (typeof reply !== 'string') { + res.writeHead(404, { 'content-type': 'text/plain' }); + return res.end('not found\r\n'); + } + + res.writeHead(200, { 'content-type': 'text/plain' }); + return res.end(reply + '\r\n'); + }); +} + +function methodNotAllowed (req, res) { + res.writeHead(405, { 'content-type': 'text/plain' }); + return res.end('method not allowed\r\n'); +} +function internalError (error, req, res) { + res.writeHead(500, { 'content-type': 'text/plain' }); + return res.end(error.message + '\r\n'); +} -- cgit v1.2.3