lfapi
view lfapi.js @ 0:ce6f95d23e1c
Initial checkin
| author | bsw | 
|---|---|
| date | Sat Sep 10 23:31:20 2011 +0200 (2011-09-10) | 
| parents | |
| children | a5a5de8dbac2 | 
 line source
     1 #!/usr/bin/env node
     3 // --------------------------------------------------------------------------
     4 // end of configuration
     5 // ==========================================================================
     7 var main = require('./lfapi/main.js');
     9 var config = main.config;
    10 var db = main.db;
    12 //var config = require('./config.js');
    14 var http = require('http');
    15 var url = require('url');
    16 var qs = require('querystring');
    18 // Add includes method to Arrays
    19 Array.prototype.includes = function (val) {
    20   for (var i=0; i < this.length; i++) if (this[i] === val) return true;
    21   return false;
    22 };
    24 // Member sessions, stored value is member_id
    25 var sessions = { };
    27 // create http server
    28 var server = http.createServer(function (req, res, params) {
    29   req.setEncoding('utf8');
    31   // parse get params
    32   var url_info = url.parse(req.url, true);
    33   var params = url_info.query;
    34   req.params = params;
    36   req.current_access_level = config.public_access_level;
    37   req.current_member_id;
    39   req.sessions = sessions;
    41   // session handling
    42   if (params.session_key) {
    43     if (sessions[params.session_key]) {
    44       req.current_member_id = sessions[params.session_key];
    45       req.current_access_level = 'member'
    46     } else {
    47       main.respond('json', null, req, res, 'forbidden', 'Invalid session key');
    48     }
    49   }
    51   // pick cookies from http headers
    52   var cookies = {};
    53   if (req.headers.cookie) {
    54     req.headers.cookie.split(';').forEach(function (cookie) {
    55       var parts = cookie.split('=');
    56       cookies[parts[0].trim()] = (parts[1] || '' ).trim();
    57     });
    58   };
    60   console.log(req.socket._idleStart, req.socket.remoteAddress, req.current_member_id, req.current_access_level, url_info.pathname, url_info.query);
    62   var body = '';
    63   req.on('data', function (data) {
    64       body += data;
    65   });
    66   req.on('end', function () {
    67     var post_params = qs.parse(body);
    68     for (key in post_params) {
    69       params[key] = post_params[key];
    70     };
    72     if (['POST', 'DELETE'].includes(params.http_method)) {
    73       req.method = params.http_method;
    74     }
    76     var routes;
    78     switch(req.method) {
    79       case 'GET':
    80         routes = main.get;
    81         break;
    83       case 'DELETE':
    84         // delete requests are handled like post request with parameter delete=1
    85         params.delete = '1';
    87       case 'POST':
    88         routes = main.post;
    89         break;
    91       default:
    92         main.respond('json', null, req, res, 'not found');
    93         break;
    95     };
    97     // dispatch request based on method and url
    99     var routing_target = routes[url_info.pathname]
   100     if (routing_target) {
   101       db.query(config.connectionString, req, res, 'START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE', function (result, conn) {
   102         routing_target.apply(this, [conn, req, res, params]);
   103       });
   104     } else {
   105       main.respond('json', null, req, res, 'not found');
   106     };
   108   });
   110 // actually connect the http server to a network interface
   111 }).listen(config.bind_port, config.bind_address);
   113 console.log('LiquidFeedback API server started with ' + config.public_access_level + ' public access at ' + config.bind_address + ':' + config.bind_port);
