diff --git a/lib/Conf/alias.js b/lib/Conf/alias.js index eae8f968..8aa090a3 100644 --- a/lib/Conf/alias.js +++ b/lib/Conf/alias.js @@ -18,4 +18,5 @@ module.exports = { Think: THINK_LIB_PATH + "/Core/Think.js", Valid: THINK_LIB_PATH + "/Core/Valid.js", View: THINK_LIB_PATH + "/Core/View.js", + WebSocket: THINK_LIB_PATH + "/Core/WebSocket.js", } \ No newline at end of file diff --git a/lib/Conf/config.js b/lib/Conf/config.js index 96f564b2..9df04dcd 100644 --- a/lib/Conf/config.js +++ b/lib/Conf/config.js @@ -33,6 +33,7 @@ module.exports = { error_tpl_path: THINK_PATH + "/View/error.html", //错误页模版 error_no_key: "errno", //错误number的key error_msg_key: "errmsg", //错误消息的key + use_websocket: false, //是否使用websocket deny_ip: [], //阻止的ip @@ -43,7 +44,7 @@ module.exports = { session_auto_start: false, //自动启动session session_id: "thinkjs", //session id - session_type: "File", //session存储类型 + session_type: "", //session存储类型, 空为内存,还可以为File, Db session_options: {}, //session的一些选项 session_cookie_sign: "", //session对应的cookie使用签名,如果使用这里填密钥 diff --git a/lib/Lib/Core/App.js b/lib/Lib/Core/App.js index 84ce7a12..747f49cf 100644 --- a/lib/Lib/Core/App.js +++ b/lib/Lib/Core/App.js @@ -4,6 +4,7 @@ */ var cluster = require("cluster"); var fs = require("fs"); +var thinkHttp = thinkRequire("Http"); var App = module.exports = Class(function(){ //controller和action的校验正则 @@ -142,10 +143,12 @@ App.run = function(){ * @type {Object} */ App.mode = { + //命令行模式 cli: function(){ - var http = thinkRequire("Http")[APP_MODE](APP_MODE_DATA); - return App.listener(http); + var defaultHttp = thinkHttp.getDefaultHttp(APP_MODE_DATA); + thinkHttp(defaultHttp.req, defaultHttp.res).run(App.listener); }, + //默认模式 _default: function(){ var clusterNums = C('use_cluster'); //不使用cluster @@ -176,15 +179,41 @@ App.mode = { */ App.createServer = function(){ var server = require("http").createServer(function (req, res) { - thinkRequire("Http")(req, res).run(App.listener); + thinkHttp(req, res).run(App.listener); }); var params = [C('port')]; //禁止外网直接通过IP访问 if (C('deny_remote_access_by_ip')) { params.push("127.0.0.1"); }; + App.websocket(server); server.listen.apply(server, params); }; +/** + * 监听websocket + * @param {[type]} server [description] + * @return {[type]} [description] + */ +App.websocket = function(server){ + if (C('use_websocket')) { + //暂时使用该库 + var websocket = require('websocket-driver'); + server.on("upgrade", function(request, socket, body){ + if (!websocket.isWebSocket(request)){ + return false; + }; + var driver = websocket.http(request); + driver.io.write(body); + socket.pipe(driver.io).pipe(socket); + driver.messages.on('data', function(message) { + message = JSON.parse(message || "{}"); + var defaultHttp = thinkRequire("Http").getDefaultHttp(); + + }); + driver.start(); + }) + }; +} /** * 监听回调函数 * @param {[type]} http [description] diff --git a/lib/Lib/Core/Http.js b/lib/Lib/Core/Http.js index e403d6e6..af1a9a8f 100644 --- a/lib/Lib/Core/Http.js +++ b/lib/Lib/Core/Http.js @@ -25,7 +25,7 @@ module.exports = Class(function(){ var method = this.req.method.toLowerCase(); var methods = ["post", "put", "patch"]; if (methods.indexOf(method) > -1) { - this.getData(callback); + this.getPostData(callback); }else{ callback && callback(this.http); } @@ -45,7 +45,7 @@ module.exports = Class(function(){ * @param {Function} callback [description] * @return {[type]} [description] */ - getData: function(callback){ + getPostData: function(callback){ //没有post数据,直接回调 if (!this.hasPostData()) { return callback && callback(this.http); @@ -115,7 +115,7 @@ module.exports = Class(function(){ extend(this.http, req); //解析url中的参数 - var urlInfo = url.parse("//" + req.headers.host + this.req.url, true, true); + var urlInfo = url.parse("//" + (req.headers.host || "127.0.0.1") + this.req.url, true, true); this.http.pathname = urlInfo.pathname; //query只记录?后面的参数 this.http.query = urlInfo.query; @@ -232,37 +232,30 @@ module.exports = Class(function(){ } }); /** - * 命令行下的简易http对象 - * @param {[type]} url [description] - * @return {[type]} [description] + * 获取默认的http信息 + * @param {[type]} data [description] + * @return {[type]} [description] */ -module.exports.cli = function(data){ - data = data.indexOf('=') > -1 ? querystring.parse(data) : {url: data}; - if (data.url.indexOf("/") !== 0) { - data.url = "/" + data.url; +module.exports.getDefaultHttp = function(data){ + data = data || {}; + if (isString(data)) { + data = data.indexOf('=') > -1 ? querystring.parse(data) : {url: data}; }; - //解析url中的参数 - var urlInfo = url.parse("//" + (data.host || "127.0.0.1") + data.url, true, true); var fn = function(){ return ""}; return { - method: data.method || "get", - ip: function(){ - return data.ip || "127.0.0.1" + req: { + httpVersion: "1.1", + method: data.method || "GET", + url: data.url || "", + headers: data.headers || {}, + connection: { + remoteAddress: data.ip || "127.0.0.1" + } }, - pathname: urlInfo.pathname, - query: urlInfo.query, - get: extend({}, urlInfo.query), - host: urlInfo.host, - hostname: urlInfo.hostname, - getHeader: fn, - setHeader: fn, - post: {}, - file: {}, - cookie: {}, - setCookie: fn, - echo: fn, - end: fn, - sendTime: fn, - redirect: fn + res: { + end: fn, + write: fn, + setHeader: fn + } } } \ No newline at end of file diff --git a/lib/Lib/Core/Session.js b/lib/Lib/Core/Session.js index 398902b7..ad2414f7 100644 --- a/lib/Lib/Core/Session.js +++ b/lib/Lib/Core/Session.js @@ -34,8 +34,8 @@ var cookie_unsign = function(val, secret){ } module.exports = Class(function(){ + var data = {}; return { - key: "", cookie: null, init: function(http){ this.http = http; @@ -69,7 +69,7 @@ module.exports = Class(function(){ * 刷新session * @return {[type]} [description] */ - flush: function(){ + save: function(){ } } @@ -100,9 +100,8 @@ module.exports.start = function(http){ http.session_cookie = session_cookie; var name = C('session_type') + "Session"; - var cls = thinkRequire(name)(http); //session类 - http.session = cls; + http.session = thinkRequire(name)(http); return cookie; }; diff --git a/lib/Lib/Core/WebSocket.js b/lib/Lib/Core/WebSocket.js new file mode 100644 index 00000000..d6a3028d --- /dev/null +++ b/lib/Lib/Core/WebSocket.js @@ -0,0 +1,21 @@ +var WebSocket = Class(function(){ + return { + init: function(request){ + this.request = request; + } + } +}) +/** + * 是否是websocket请求 + * @param {[type]} req [description] + * @return {Boolean} [description] + */ +WebSocket.isWebSocket = function(request){ + if (request.method !== 'GET') { + return false; + }; + var connection = request.headers.connection || ""; + var upgrade = request.headers.upgrade; + return connection.toLowerCase().indexOf('upgrade') > -1 && upgrade.toLowerCase() === 'websocket'; +} +module.exports = WebSocket; \ No newline at end of file