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 +

Impressum / About Us