lfapi

view lfapi.js @ 36:268b74abaceb

Handle not supported HTTP request methods
author bsw
date Tue Jul 31 11:51:46 2012 +0200 (2012-07-31)
parents a5a5de8dbac2
children 0eef836b8f54
line source
1 #!/usr/bin/env node
3 var main = require('./lfapi/main.js');
5 var config = main.config;
6 var db = main.db;
8 //var config = require('./config.js');
10 var http = require('http');
11 var url = require('url');
12 var qs = require('querystring');
14 // Add includes method to Arrays
15 Array.prototype.includes = function (val) {
16 for (var i=0; i < this.length; i++) if (this[i] === val) return true;
17 return false;
18 };
20 // Member sessions, stored value is member_id
21 var sessions = { };
23 // create http server
24 var server = http.createServer(function (req, res, params) {
25 req.setEncoding('utf8');
27 // parse get params
28 var url_info = url.parse(req.url, true);
29 var params = url_info.query;
30 req.params = params;
32 req.current_access_level = config.public_access_level;
33 req.current_member_id;
35 req.sessions = sessions;
37 // session handling
38 if (params.session_key) {
39 if (sessions[params.session_key]) {
40 req.current_member_id = sessions[params.session_key];
41 req.current_access_level = 'member'
42 } else {
43 main.respond('json', null, req, res, 'forbidden', 'Invalid session key');
44 }
45 }
47 // pick cookies from http headers
48 var cookies = {};
49 if (req.headers.cookie) {
50 req.headers.cookie.split(';').forEach(function (cookie) {
51 var parts = cookie.split('=');
52 cookies[parts[0].trim()] = (parts[1] || '' ).trim();
53 });
54 };
56 console.log(req.socket._idleStart, req.socket.remoteAddress, req.current_member_id, req.current_access_level, req.method, url_info.pathname, url_info.query);
58 var body = '';
59 req.on('data', function (data) {
60 body += data;
61 });
62 req.on('end', function () {
63 var post_params = qs.parse(body);
64 for (key in post_params) {
65 params[key] = post_params[key];
66 };
68 if (['POST', 'DELETE'].includes(params.http_method)) {
69 req.method = params.http_method;
70 }
72 var routes;
74 switch(req.method) {
75 case 'HEAD':
76 routes = main.get;
77 var routing_target = routes[url_info.pathname]
78 if (routing_target) {
79 res.writeHead(
80 200,
81 {
82 'Content-Type': "application/json; charset=UTF-8",
83 'Access-Control-Allow-Origin': '*'
84 }
85 );
86 } else {
87 res.writeHead(
88 404,
89 {
90 'Access-Control-Allow-Origin': '*'
91 }
92 );
93 }
94 res.end(body);
95 return
96 break;
98 case 'GET':
99 routes = main.get;
100 break;
102 case 'DELETE':
103 // delete requests are handled like post request with parameter delete=1
104 params.delete = '1';
106 case 'POST':
107 routes = main.post;
108 break;
110 default:
111 main.respond('json', null, req, res, 'not found');
112 return;
113 break;
115 };
117 // dispatch request based on method and url
118 if (routes) {
119 var routing_target = routes[url_info.pathname]
120 if (routing_target) {
121 db.query(config.connectionString, req, res, 'START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE', function (result, conn) {
122 routing_target.apply(this, [conn, req, res, params]);
123 });
124 return;
125 }
126 }
128 main.respond('json', null, req, res, 'not found');
130 });
132 // actually connect the http server to a network interface
133 }).listen(config.bind_port, config.bind_address);
135 console.log('LiquidFeedback API server started with ' + config.public_access_level + ' public access at ' + config.bind_address + ':' + config.bind_port);

Impressum / About Us