lfapi
diff lfapi.js @ 0:ce6f95d23e1c
Initial checkin
author | bsw |
---|---|
date | Sat Sep 10 23:31:20 2011 +0200 (2011-09-10) |
parents | |
children | a5a5de8dbac2 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/lfapi.js Sat Sep 10 23:31:20 2011 +0200 1.3 @@ -0,0 +1,116 @@ 1.4 +#!/usr/bin/env node 1.5 + 1.6 +// -------------------------------------------------------------------------- 1.7 +// end of configuration 1.8 +// ========================================================================== 1.9 + 1.10 +var main = require('./lfapi/main.js'); 1.11 + 1.12 +var config = main.config; 1.13 +var db = main.db; 1.14 + 1.15 +//var config = require('./config.js'); 1.16 + 1.17 +var http = require('http'); 1.18 +var url = require('url'); 1.19 +var qs = require('querystring'); 1.20 + 1.21 +// Add includes method to Arrays 1.22 +Array.prototype.includes = function (val) { 1.23 + for (var i=0; i < this.length; i++) if (this[i] === val) return true; 1.24 + return false; 1.25 +}; 1.26 + 1.27 +// Member sessions, stored value is member_id 1.28 +var sessions = { }; 1.29 + 1.30 +// create http server 1.31 +var server = http.createServer(function (req, res, params) { 1.32 + req.setEncoding('utf8'); 1.33 + 1.34 + // parse get params 1.35 + var url_info = url.parse(req.url, true); 1.36 + var params = url_info.query; 1.37 + req.params = params; 1.38 + 1.39 + req.current_access_level = config.public_access_level; 1.40 + req.current_member_id; 1.41 + 1.42 + req.sessions = sessions; 1.43 + 1.44 + // session handling 1.45 + if (params.session_key) { 1.46 + if (sessions[params.session_key]) { 1.47 + req.current_member_id = sessions[params.session_key]; 1.48 + req.current_access_level = 'member' 1.49 + } else { 1.50 + main.respond('json', null, req, res, 'forbidden', 'Invalid session key'); 1.51 + } 1.52 + } 1.53 + 1.54 + // pick cookies from http headers 1.55 + var cookies = {}; 1.56 + if (req.headers.cookie) { 1.57 + req.headers.cookie.split(';').forEach(function (cookie) { 1.58 + var parts = cookie.split('='); 1.59 + cookies[parts[0].trim()] = (parts[1] || '' ).trim(); 1.60 + }); 1.61 + }; 1.62 + 1.63 + console.log(req.socket._idleStart, req.socket.remoteAddress, req.current_member_id, req.current_access_level, url_info.pathname, url_info.query); 1.64 + 1.65 + var body = ''; 1.66 + req.on('data', function (data) { 1.67 + body += data; 1.68 + }); 1.69 + req.on('end', function () { 1.70 + var post_params = qs.parse(body); 1.71 + for (key in post_params) { 1.72 + params[key] = post_params[key]; 1.73 + }; 1.74 + 1.75 + if (['POST', 'DELETE'].includes(params.http_method)) { 1.76 + req.method = params.http_method; 1.77 + } 1.78 + 1.79 + var routes; 1.80 + 1.81 + switch(req.method) { 1.82 + case 'GET': 1.83 + routes = main.get; 1.84 + break; 1.85 + 1.86 + case 'DELETE': 1.87 + // delete requests are handled like post request with parameter delete=1 1.88 + params.delete = '1'; 1.89 + 1.90 + case 'POST': 1.91 + routes = main.post; 1.92 + break; 1.93 + 1.94 + default: 1.95 + main.respond('json', null, req, res, 'not found'); 1.96 + break; 1.97 + 1.98 + }; 1.99 + 1.100 + // dispatch request based on method and url 1.101 + 1.102 + var routing_target = routes[url_info.pathname] 1.103 + if (routing_target) { 1.104 + db.query(config.connectionString, req, res, 'START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE', function (result, conn) { 1.105 + routing_target.apply(this, [conn, req, res, params]); 1.106 + }); 1.107 + } else { 1.108 + main.respond('json', null, req, res, 'not found'); 1.109 + }; 1.110 + 1.111 + }); 1.112 + 1.113 +// actually connect the http server to a network interface 1.114 +}).listen(config.bind_port, config.bind_address); 1.115 + 1.116 +console.log('LiquidFeedback API server started with ' + config.public_access_level + ' public access at ' + config.bind_address + ':' + config.bind_port); 1.117 + 1.118 + 1.119 +