From f0cc9a36e2818810059b98a1660070468cd51f53 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sun, 24 Feb 2013 08:46:01 -0500 Subject: [PATCH] refactored --- cloudcmd.js | 86 +++++++++-- lib/server/commander.js | 334 +++++++--------------------------------- lib/server/main.js | 81 ++++++++++ lib/util.js | 6 +- 4 files changed, 212 insertions(+), 295 deletions(-) diff --git a/cloudcmd.js b/cloudcmd.js index 981ff505..93130e83 100644 --- a/cloudcmd.js +++ b/cloudcmd.js @@ -229,20 +229,8 @@ else if( Util.isContainStr(p.name, FS) || Util.strCmp( p.name, '/') ){ if( Util.isContainStr(p.name, 'no-js/') ) return noJSTMPRedirection(pParams); - - var lQuery = main.getQuery(p.request), - lName = Minify.allowed.html ? - Minify.getName(INDEX) : INDEX; - - if( !lQuery ) - p.request.url += '?html'; - - lRet = main.commander.sendContent({ - request : p.request, - response : p.response, - processing : indexProcessing, - index : lName - }); + + lRet = sendCommanderContent(p); } /* termporary redirect for old urls */ else @@ -252,6 +240,76 @@ return lRet; } + function sendCommanderContent(pParams){ + var lRet = Util.checkObjTrue( pParams, ['name', REQUEST, RESPONSE] ); + if(lRet){ + var p = pParams; + p.name = Util.removeStr(p.name, CloudFunc.FS) || main.SLASH; + + fs.stat(p.name, function(pError, pStat){ + if(!pError) + if( pStat.isDirectory() ) + processCommanderContent(pParams); + else + main.sendFile(p); + else + sendError(pParams, pError); + + }); + } + } + + function processCommanderContent(pParams){ + var lRet = Util.checkObjTrue( pParams, ['name', REQUEST, RESPONSE] ); + if(lRet){ + var p = pParams; + main.commander.getDirContent(p.name, function(pError, pJSON){ + if(!pError){ + var lQuery = main.getQuery(p.request); + if(lQuery === 'json'){ + p.data = Util.stringifyJSON(pJSON); + p.name +='.json'; + main.sendResponse(p); + } + else if(!lQuery){ /* get back html*/ + var lName = Minify.allowed.html ? + Minify.getName(INDEX) : INDEX; + fs.readFile(lName, function(pError, pData){ + if(!pError){ + var lPanel = CloudFunc.buildFromJSON(pJSON), + lList = '' + + ''; + + p.data = indexProcessing({ + additional : lList, + data : pData, + }); + + main.sendResponse(p); + } + else + sendError(pParams, pError); + }); + } + } + else + sendError(pParams, pError); + }); + } + } + + function sendError(pParams, pError){ + var lRet = Util.checkObjTrue(pParams, + ['name', 'data', 'request', 'response']); + + if(lRet){ + var p = pParams; + p.status = main.FILE_NOT_FOUND; + p.data = pError; + main.sendResponse(p); + } + } + function noJSTMPRedirection(pParams){ var MOVED_PERMANENTLY = 301, lPath = Util.removeStr(pParams.name, 'no-js/'); diff --git a/lib/server/commander.js b/lib/server/commander.js index 97072db3..ca2411c5 100644 --- a/lib/server/commander.js +++ b/lib/server/commander.js @@ -12,61 +12,17 @@ var main = global.cloudcmd.main, fs = main.fs, - CloudFunc = main.cloudfunc, - DIR = main.DIR, - LIBDIR = main.LIBDIR, - HTMLDIR = main.HTMLDIR, - Util = main.util, - url = main.url, - querystring = main.querystring, - zlib = main.zlib, - - FILE_NOT_FOUND = main.FILE_NOT_FOUND, - OK = main.OK, - FS = CloudFunc.FS, - - INDEX, - REQUEST = 'request', - RESPONSE = 'response', - - IndexProcessingFunc = null; + Util = main.util; - - exports.sendContent = function(pParams){ - var lRet = Util.checkObjTrue(pParams, [REQUEST, RESPONSE, 'index']); - - if(lRet){ - var p = pParams, - lPath = getCleanPath(p.request); - - if(!INDEX) - INDEX = p.index; - - if(!IndexProcessingFunc) - IndexProcessingFunc = pParams.processing; - - fs.stat(lPath, function(pError, pStat){ - if(!pError) - if(pStat.isDirectory()) - fs.readdir(lPath, Util.call(readDir, pParams) ); - else - main.sendFile({ - name : lPath, - request : p.request, - response : p.response - }); - else - sendResponse({ - name : lPath, - status : FILE_NOT_FOUND, - data : pError.toString(), - request : p.request, - response : p.response - }); - }); - - lRet = true; - } + exports.getDirContent = function(pPath, pCallBack){ + var lRet = Util.isString(pPath); + if( lRet ) + fs.readdir(pPath, Util.call(readDir, { + callback: pCallBack, + path : pPath + })); + else + Util.exec(pCallBack, "First parameter should be a string"); return lRet; }; @@ -79,15 +35,12 @@ */ function readDir(pParams){ var lRet = checkParams(pParams); - - if(lRet) - lRet = Util.checkObjTrue(pParams.params, - [REQUEST, RESPONSE]); + lRet = lRet && Util.checkObj(pParams.params, ['path']); if(lRet){ var p = pParams, - c = p.params, + c = pParams.params, lFiles = p.data, - lDirPath = getDirPath(c.request); + lDirPath = getDirPath(c.path); if(!p.error && lFiles){ lFiles.data = lFiles.sort(); @@ -98,8 +51,8 @@ lFilesData = { files : lFiles, stats : lStats, - request : c.request, - response : c.response + callback : p.callback, + path : c.path }, lFill = function(){ @@ -123,13 +76,7 @@ fillJSON(lFilesData); } else - sendResponse({ - data : p.error.toString(), - name : lDirPath, - request : c.request, - response: c.response, - status : FILE_NOT_FOUND - }); + Util.exec(p.callback, p.error.toString()); } } @@ -139,10 +86,8 @@ */ function getFilesStat(pParams){ var lRet = checkParams(pParams); - - if(lRet) - lRet = Util.checkObj(pParams.params, - ['callback'], ['stats', 'name', 'count']); + lRet = lRet && Util.checkObjTrue(pParams.params, + ['callback', 'stats', 'name', 'count']); if(lRet){ var p = pParams, @@ -169,227 +114,60 @@ * @param pFiles - array of files of current directory */ function fillJSON(pParams){ - var lFiles, lAllStats, - i, n, lReq, lRes; + var lRet = checkParams(pParams, ['files', 'stats', 'path']); - if(pParams){ - lFiles = pParams.files; - lFiles &&(n = lFiles.length || 0); - lAllStats = pParams.stats; - lReq = pParams.request, - lRes = pParams.response; - } - /* данные о файлах в формате JSON*/ - var lJSON = [], - lJSONFile = {}, - lList, - lDirPath = getDirPath(lReq); - - lJSON[0] = { - path : lDirPath, - size : 'dir' - }; - - var lName, lStats, lMode, lIsDir; - for( i = 0; i < n; i++ ){ - /* Переводим права доступа в 8-ричную систему */ - lName = lFiles[i], - lStats = lAllStats[lName]; + if(lRet) + { + var p = pParams, + i, n = p.files.length || 0, + + /* данные о файлах в формате JSON*/ + lJSON = [], + lJSONFile = {}, + lList, + lDirPath = getDirPath(p.path); - if(lStats){ - lMode = (lStats.mode - 0).toString(8), - lIsDir = lStats.isDirectory(); - } - - /* Если папка - выводим пиктограмму папки * - * В противоположном случае - файла */ - lJSONFile = { - 'name' : lFiles[i], - 'size' : lIsDir ? 'dir' : lStats.size, - 'uid' : lStats.uid, - 'mode' : lMode + lJSON[0] = { + path : lDirPath, + size : 'dir' }; - lJSON[i+1] = lJSONFile; - } - - /* если js отключен выcылаем html-код */ - if( main.getQuery(lReq) === 'html' ){ - var lPanel = CloudFunc.buildFromJSON(lJSON); - lList = '' + - ''; - - fs.readFile(INDEX, Util.call(readFile, { - name : getCleanPath(lReq), - list : lList, - request : lReq, - response : lRes - }) - ); - - }else{ - lDirPath = lDirPath.substr(lDirPath, lDirPath.lastIndexOf('/') ); - - /* в обычном режиме(когда js включен - * высылаем json-структуру файлов - * с соответствующими заголовками - */ - lList = Util.stringifyJSON(lJSON); - - sendResponse({ - name : lDirPath + '.json', - data : lList, - request : lReq, - response: lRes - }); - - } - } - - - /** - * Функция генерирует функцию считывания файла - * таким образом, что бы у нас было - * имя считываемого файла - * @param pName - полное имя файла - */ - function readFile(pParams){ - var lRet = checkParams(pParams); - - if(lRet) - lRet = Util.checkObjTrue(pParams.params, - [REQUEST, RESPONSE, 'list']); - - if(lRet){ - var p = pParams, - c = pParams.params; - - p.data = p.data.toString(); - - var lParams = { - name : INDEX, - request : c.request, - response : c.response, - }, + var lName, lStats, lMode, lIsDir; + for( i = 0; i < n; i++ ){ + /* Переводим права доступа в 8-ричную систему */ + lName = p.files[i], + lStats = p.stats[lName]; - lProccessed = Util.exec(IndexProcessingFunc, { - additional : c.list, - data : p.data, - }); - - if(lProccessed) - p.data = lProccessed; - - if (!p.Error){ - lParams.data = p.data; - Util.log('file ' + c.name + ' readed'); - } - else{ - lParams.status = FILE_NOT_FOUND; - lParams.data = p.error.toString(); - } + if(lStats){ + lMode = (lStats.mode - 0).toString(8), + lIsDir = lStats.isDirectory(); + } - sendResponse(lParams); - } - } - /** - * Функция высылает ответ серверу - * @param pHead - заголовок - * @param Data - данные - * @param pName - имя отсылаемого файла - */ - function sendResponse(pParams){ - var lRet = Util.checkObjTrue(pParams, - ['name', 'data', REQUEST, RESPONSE]); - - if(lRet){ - var p = pParams; - - var lQuery = main.getQuery(p.request), - /* download, json */ - lGzip = main.isGZIP(p.request), - lHead = main.generateHeaders({ - name : p.name, - gzip : lGzip, - query : lQuery - }); - - /* если браузер поддерживает gzip-сжатие - сжимаем данные*/ - Util.ifExec(!lGzip, - function(pParams){ - var lRet = Util.checkObj(pParams, ['data']); - - if(lRet){ - p.status = pParams.status || p.status; - p.data = pParams.data; - } - - p.response.writeHead(p.status || OK, lHead); - p.response.end(p.data); - - Util.log( p.name + ' sended'); - Util.log( p.status === FILE_NOT_FOUND && p.data ); - }, + /* Если папка - выводим пиктограмму папки * + * В противоположном случае - файла */ + lJSONFile = { + 'name' : p.files[i], + 'size' : lIsDir ? 'dir' : lStats.size, + 'uid' : lStats.uid, + 'mode' : lMode + }; - function(pCallBack){ - zlib.gzip (p.data, Util.call(gzipData, { - callback : pCallBack - })); - }); - } - } - - /** - * Функция получает сжатые данные - * @param pHeader - заголовок файла - * @pName - */ - function gzipData(pParams){ - var lRet = checkParams(pParams); - - if(lRet) - lRet = Util.checkObj(pParams.params, ['callback']); - - if(lRet){ - var p = pParams, - c = pParams.params, - lParams = {}; - - if(!p.error) - lParams.data = p.data; - else{ - lParams.status = FILE_NOT_FOUND; - lParams.data = p.error.toString(); + lJSON[i+1] = lJSONFile; } - Util.exec(c.callback, lParams); + lDirPath = lDirPath.substr(lDirPath, lDirPath.lastIndexOf('/') ); + + Util.exec(p.callback, null, lList); + } } - function checkParams(pParams){ return Util.checkObj(pParams, ['error', 'data', 'params']); } - function getPath(pReq){ - var lParsedUrl = url.parse(pReq.url), - lPath = lParsedUrl.pathname; - - lPath = querystring.unescape(lPath); - return lPath; - } - - - function getCleanPath(pReq){ - var lPath = getPath(pReq), - lRet = Util.removeStr(lPath, FS) || main.SLASH; - - return lRet; - } - - - function getDirPath(pReq){ - var lRet = getCleanPath(pReq); + function getDirPath(pPath){ + var lRet = pPath; if(lRet !== '/') lRet += '/'; diff --git a/lib/server/main.js b/lib/server/main.js index ebaef19d..fb80efb8 100644 --- a/lib/server/main.js +++ b/lib/server/main.js @@ -241,6 +241,87 @@ return lRet; } + + + /** + * Функция высылает ответ серверу + * @param pHead - заголовок + * @param Data - данные + * @param pName - имя отсылаемого файла + */ + function sendResponse(pParams){ + var lRet = Util.checkObjTrue(pParams, + ['name', 'data', 'request', 'response']); + + if(lRet){ + var p = pParams; + + var lQuery = getQuery(p.request), + /* download, json */ + lGzip = isGZIP(p.request), + lHead = generateHeaders({ + name : p.name, + gzip : lGzip, + query : lQuery + }); + + /* если браузер поддерживает gzip-сжатие - сжимаем данные*/ + Util.ifExec(!lGzip, + function(pParams){ + var lRet = Util.checkObj(pParams, ['data']); + + if(lRet){ + p.status = pParams.status || p.status; + p.data = pParams.data; + } + + p.response.writeHead(p.status || OK, lHead); + p.response.end(p.data); + + Util.log( p.name + ' sended'); + Util.log( p.status === FILE_NOT_FOUND && p.data ); + }, + + function(pCallBack){ + zlib.gzip (p.data, Util.call(gzipData, { + callback : pCallBack + })); + }); + } + } + + /** + * Функция получает сжатые данные + * @param pHeader - заголовок файла + * @pName + */ + function gzipData(pParams){ + var lRet = checkParams(pParams); + + if(lRet) + lRet = Util.checkObj(pParams.params, ['callback']); + + if(lRet){ + var p = pParams, + c = pParams.params, + lParams = {}; + + if(!p.error) + lParams.data = p.data; + else{ + lParams.status = FILE_NOT_FOUND; + lParams.data = p.error.toString(); + } + + Util.exec(c.callback, lParams); + } + } + + + function checkParams(pParams){ + return Util.checkObj(pParams, ['error', 'data', 'params']); + } + function getQuery(pReq){ var lQuery, lParsedUrl; diff --git a/lib/util.js b/lib/util.js index 77c3463b..6069af3a 100644 --- a/lib/util.js +++ b/lib/util.js @@ -651,15 +651,15 @@ Util = exports || {}; * @param pCallBack * @param pArg */ - Util.exec = function(pCallBack, pArg){ + Util.exec = function(pCallBack, pArg, pArg1){ var lRet; if(pCallBack){ if( Util.isFunction(pCallBack) ) - lRet = pCallBack(pArg); + lRet = pCallBack(pArg, pArg1); else { var lCallBack = pCallBack.callback || pCallBack.success; - lRet = Util.exec(lCallBack, pArg); + lRet = Util.exec(lCallBack, pArg, pArg1); } }