|
|
@@ -0,0 +1,98 @@
|
|
|
+var http = require("http")
|
|
|
+ ,clientSession = require("client-sessions")
|
|
|
+ ,sleep = require("sleep").sleep
|
|
|
+
|
|
|
+ ,Url = require("./url.js").Url
|
|
|
+ ,Slack = require("./slack.js").Slack
|
|
|
+ ,config = require("../config.js")
|
|
|
+ ,sessionManager = require("./session.js").SessionManager;
|
|
|
+
|
|
|
+function Server(port) {
|
|
|
+ var ctx = this;
|
|
|
+
|
|
|
+ this.httpServ = http.createServer(function(req, res) {
|
|
|
+ ctx.onRequest(req, res);
|
|
|
+ });
|
|
|
+ this.httpServ.listen(port, ctx.onListen);
|
|
|
+}
|
|
|
+
|
|
|
+Server.parseCookies = function(req) {
|
|
|
+ var cookies = req.headers.cookie
|
|
|
+ ,cookieObj = null;
|
|
|
+
|
|
|
+ if (cookies) {
|
|
|
+ cookieObj = {};
|
|
|
+ cookies = cookies.split(";");
|
|
|
+ for (var cookieIndex =0, nbCookies =cookies.length; cookieIndex < nbCookies; cookieIndex++) {
|
|
|
+ var cookieParts = cookies[cookieIndex].indexOf("=")
|
|
|
+ ,cookieKey = null
|
|
|
+ ,cookieValue = null;
|
|
|
+
|
|
|
+ if (cookieParts === -1) {
|
|
|
+ cookieKey = cookies[cookieIndex].trim();
|
|
|
+ } else {
|
|
|
+ cookieKey = cookies[cookieIndex].substr(0, cookieParts).trim();
|
|
|
+ cookieValue = cookies[cookieIndex].substr(cookieParts +1).trim();
|
|
|
+ }
|
|
|
+ cookieObj[cookieKey] = cookieValue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return cookieObj;
|
|
|
+}
|
|
|
+
|
|
|
+Server.stringifyCookies = function(cookies) {
|
|
|
+ var cookieString = "";
|
|
|
+ for (var cookieKey in cookies) {
|
|
|
+ cookieString += cookieString;
|
|
|
+ if (cookies[cookieString] !== null) {
|
|
|
+ cookieString += "=";
|
|
|
+ }
|
|
|
+ cookieString += "; ";
|
|
|
+ }
|
|
|
+ return cookieString;
|
|
|
+}
|
|
|
+
|
|
|
+Server.prototype.onListen = function() {
|
|
|
+ console.log("onListen");
|
|
|
+}
|
|
|
+
|
|
|
+Server.prototype.onRequest = function(req, res) {
|
|
|
+ req.reqT = Date.now();
|
|
|
+ req.cookies = Server.parseCookies(req);
|
|
|
+ req.session = sessionManager.forRequest(req);
|
|
|
+ req.urlObj = new Url(req.url);
|
|
|
+
|
|
|
+ if ((!req.session || !req.session.slackToken) && false) {
|
|
|
+ if (req.urlObj.queryTokens.code) {
|
|
|
+ req.session = sessionManager.lazyForRequest(req);
|
|
|
+ req.session.setSlackToken(req.reqT, req.urlObj.queryTokens.code[0]);
|
|
|
+ res.writeHeader("302", {
|
|
|
+ Location: config.rootUrl
|
|
|
+ ,"Set-Cookie": "sessID="+req.session.sessId
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ res.writeHeader("302", {
|
|
|
+ Location: "https://slack.com/oauth/authorize"
|
|
|
+ +"?client_id=" +config.clientId
|
|
|
+ +"&scope=" +Slack.getScope().join(" ")
|
|
|
+ +"&redirect=" +config.rootUrl
|
|
|
+ });
|
|
|
+ }
|
|
|
+ } else if (req.urlObj.isPublic()) {
|
|
|
+ res.setHeader('Cache-Control', 'public, max-age=' +15 * 60);
|
|
|
+ res.setHeader('Content-Length', req.urlObj.serve.stat.size);
|
|
|
+ res.writeHeader("200");
|
|
|
+ req.urlObj.getReadStream().pipe(res, { end: true });
|
|
|
+ return; // async pipe will close when finished
|
|
|
+ } else {
|
|
|
+ res.writeHeader("200");
|
|
|
+ res.write('"' +Math.floor(Date.now() /1000) +'"');
|
|
|
+ }
|
|
|
+ if (req.session && req.session.modifiedAt === req.reqT) {
|
|
|
+ sessionManager.saveSession(req.session);
|
|
|
+ }
|
|
|
+ res.end();
|
|
|
+}
|
|
|
+
|
|
|
+module.exports.HttpServ = Server;
|
|
|
+
|