From 79c11fd3b829295c30d57856e7fd58d219d474a2 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 5 Feb 2013 03:40:14 -0500 Subject: [PATCH] refactored --- cloudcmd.js | 11 +- json/config.json | 2 +- lib/server.js | 445 +++------------------------------------- lib/server/commander.js | 3 +- 4 files changed, 43 insertions(+), 418 deletions(-) diff --git a/cloudcmd.js b/cloudcmd.js index 6c30dc4d..e1d373a5 100644 --- a/cloudcmd.js +++ b/cloudcmd.js @@ -20,11 +20,12 @@ Config = main.config, REQUEST = 'request', - RESPONSE = 'response'; + RESPONSE = 'response', + INDEX = DIR + 'html/index.html'; /* reinit main dir os if we on * Win32 should be backslashes */ - DIR = main.DIR, + DIR = main.DIR; readConfig(); Server.start(Config, { @@ -100,7 +101,6 @@ var lOptimizeParams = [], lStyleCSS = DIR + 'css/style.css', lResetCSS = DIR + 'css/reset.css', - lIndex = DIR + 'html/index.html', lCSSOptions = { img : pAllowed.img, @@ -111,7 +111,7 @@ lOptimizeParams.push(LIBDIR + 'client.js'); if (pAllowed.html) - lOptimizeParams.push(lIndex); + lOptimizeParams.push(INDEX); if (pAllowed.css) { var lStyles = [{}, {}]; @@ -205,7 +205,8 @@ lRet = main.commander.sendContent({ request : pParams[REQUEST], response : pParams[RESPONSE], - processing : indexProcessing + processing : indexProcessing, + index : Minify.allowed.html ? Minify.getName(INDEX) : INDEX }); } diff --git a/json/config.json b/json/config.json index 05c7219d..428b8a2c 100644 --- a/json/config.json +++ b/json/config.json @@ -4,7 +4,7 @@ "minification" : { "js" : false, "css" : true, - "html" : false, + "html" : true, "img" : true }, "logs" : false, diff --git a/lib/server.js b/lib/server.js index 4a0aa386..8c6da4f8 100644 --- a/lib/server.js +++ b/lib/server.js @@ -127,7 +127,6 @@ var lConfig = this.Config; - CloudServer.indexProcessing = pProcessing.index; CloudServer.rest = pProcessing.rest; CloudServer.route = pProcessing.route; CloudServer.minimize = pProcessing.minimize; @@ -181,41 +180,16 @@ var lConfig = CloudServer.Config, lURL = main.url, lParsedUrl = lURL.parse(pReq.url), - lPath = lParsedUrl.pathname, - - /* varible contain one of queris: - * download - change content-type for - * make downloading process - * from client js - * json - /no-js/ will be removed, and - * if we will wont get directory - * content wi will set json - * query like this - * ?json - */ - lQuery = lParsedUrl.query; - if(lQuery) - Util.log('query = ' + lQuery); - + lPath = lParsedUrl.pathname; + /* added supporting of Russian language in directory names */ lPath = Querystring.unescape(lPath); Util.log('pathname: ' + lPath); - - /* получаем поддерживаемые браузером кодировки*/ - var lAcceptEncoding = pReq.headers['accept-encoding']; + /* запоминаем поддерживает ли браузер * gzip-сжатие при каждом обращении к серверу * и доступен ли нам модуль zlib */ - if (lAcceptEncoding && - lAcceptEncoding.match(/\bgzip\b/) && Zlib) - CloudServer.Gzip = true; - - /* путь в ссылке, который говорит - * что js отключен - */ - var lNoJS_s = CloudFunc.NOJS, - lFS_s = CloudFunc.FS; Util.log("request for " + lPath + " received..."); @@ -240,391 +214,40 @@ return; } - /* если в пути нет информации ни о ФС, - * ни об отсутствии js, - * ни о том, что это корневой - * каталог - загружаем файлы проэкта - */ - if ( !Util.isContainStr(lPath, lFS_s) && - !Util.isContainStr(lPath, lNoJS_s) && - !Util.strCmp(lPath, '/') && - !Util.strCmp(lQuery, 'json') ) { + /* если имена файлов проекта - загружаем их * + * убираем слеш и читаем файл с текущец директории */ + + /* добавляем текующий каталог к пути */ + var lName = '.' + lPath; + Util.log('reading ' + lName); + + /* watching is file changed */ + if(lConfig.appcache) + AppCache.watch(lName); + + Util.log(Path.basename(lName)); + + var lMin = Minify.allowed, + lExt = Util.getExtension(lName), + lResult = lExt === '.js' && lMin.js || + lExt === '.css' && lMin.css || + lExt === '.html' && lMin.html; + + Util.ifExec(!lResult, function(pParams){ + var lSendName = pParams && pParams.name || lName; - /* если имена файлов проекта - загружаем их * - * убираем слеш и читаем файл с текущец директории */ - - /* добавляем текующий каталог к пути */ - var lName = '.' + lPath; - Util.log('reading ' + lName); - - /* watching is file changed */ - if(lConfig.appcache) - AppCache.watch(lName); - - Util.log(Path.basename(lName)); - var lMin = Minify.allowed, - lExt = Util.getExtension(lName), - lResult = lExt === '.js' && lMin.js || - lExt === '.css' && lMin.css || - lExt === '.html' && lMin.html; - - Util.ifExec(!lResult, function(pParams){ - var lSendName = pParams && pParams.name || lName; - - main.sendFile({ - name : lSendName, - request : pReq, - response : pRes - }); - }, function(pCallBack){ - Minify.optimize(lName, { - request : pReq, - response : pRes, - callback : pCallBack - }); + main.sendFile({ + name : lSendName, + request : pReq, + response : pRes }); - - }else{ - /* если мы имеем дело с файловой системой - * если путь не начинаеться с no-js - значит - * js включен - */ - - if(lPath.indexOf(lNoJS_s) !== lFS_s.length && lPath !== '/') - CloudServer.NoJS = false; - else{ - CloudServer.NoJS = true; - lPath = Util.removeStr(lPath, lNoJS_s); - } - - /* убираем индекс файловой системы */ - if(lPath.indexOf(lFS_s) === 0){ - lPath = Util.removeStr(lPath, lFS_s); - - /* если посетитель только зашел на сайт - * no-js будет пустым, как и fs. - * Если в пути нету fs - посетитель только зашел на сайт - * загружаем его полностью. - */ - } - - /* if query json setted up - * load json data, no-js false. - */ - - if(lQuery === 'json') - CloudServer.NoJS = false; - - /* Если мы не в корне добавляем слеш к будующим ссылкам */ - DirPath = lPath || '/'; - - CloudServer.Responses[DirPath] = pRes; - CloudServer.Statuses[DirPath] = OK; - - /* saving query of current file */ - CloudServer.Queries[DirPath] = lQuery; - Util.log(lQuery); - - Util.log(DirPath); - - - /* читаем основные данные о файле */ - Fs.stat(DirPath, CloudServer._stated); - - /* если установлено сжатие - * меняем название html-файла и - * загружаем сжатый html-файл в дальнейшем - */ - - var lMinName = Minify.getName(main.DIR + 'html/index.html'); - - CloudServer.INDEX = Minify.allowed.html ? lMinName : CloudServer.INDEX; - - /* - * сохраним указатель на response - * и на статус ответа - */ - CloudServer.Responses[CloudServer.INDEX] = pRes; - CloudServer.Statuses [CloudServer.INDEX] = OK; - } - }; - - /** - * Function geted stat information about file - * @param pError - * @param pStat - */ - CloudServer._stated = function(pError, pStat){ - if(!pError && pStat){ - /* если это каталог - читаем его содержимое */ - if(pStat.isDirectory()) - Fs.readdir(DirPath, CloudServer._readDir); - /* отдаём файл */ - else if(pStat.isFile()){ - Fs.readFile(DirPath, CloudServer.getReadFileFunc(DirPath)); - Util.log('reading file: '+ DirPath); - } - }else{ - CloudServer.Statuses[DirPath] = 404; - CloudServer.sendResponse(null, pError.toString(), DirPath); - } - }; - - - /** - * Функция читает ссылку или выводит информацию об ошибке - * @param pError - * @param pFiles - */ - CloudServer._readDir = function (pError, pFiles) - { - if(pError){ - Util.log(pError); - - CloudServer.Statuses[DirPath] = 404; - CloudServer.sendResponse(null, pError.toString(), DirPath); - return; - } - /* Если мы не в корне добавляем слеш к будующим ссылкам */ - if(DirPath !== '/') - DirPath += '/'; - - pFiles = pFiles.sort(); - - var lCount = 0, - lStats = {}; - - /* asyn getting file states - * and putting it to lStats object - */ - var getFilesStat_f = function(pName){ - return function(pError, pStat){ - if(pError) - lStats[pName] = { - 'mode' : 0, - 'size' : 0, - 'isDirectory' : Util.retFalse - }; - - else - lStats[pName] = pStat; - - /* if this file is last - moving next */ - if(++lCount === pFiles.length) - CloudServer._fillJSON(lStats, pFiles); - }; - }; - - if(pFiles.length) - for(var i = 0; i < pFiles.length; i++) - /* Получаем информацию о файле */ - Fs.stat(DirPath + pFiles[i], getFilesStat_f(pFiles[i])); - - else - CloudServer._fillJSON(null, pFiles); - }; - - /** - * Function fill JSON by file stats - * - * @param pStats - object, contain file stats. - * example {'1.txt': stat} - * - * @param pFiles - array of files of current directory - */ - CloudServer._fillJSON = function(pStats, pFiles){ - /* данные о файлах в формате JSON*/ - var lJSON = [], - lJSONFile = {}, - lHeader, /* заголовок ответа сервера */ - lList; - - lJSON[0] = { - path : DirPath, - size : 'dir' - }; - - for(var i = 0; i < pFiles.length; i++){ - /* - *Переводим права доступа в 8-ричную систему - */ - var lName = pFiles[i], - - lMode = (pStats[lName].mode-0).toString(8), - lStats = pStats[lName], - lIsDir = lStats.isDirectory(); - - /* Если папка - выводим пиктограмму папки * - * В противоположном случае - файла */ - lJSONFile = { - 'name' : pFiles[i], - 'size' : lIsDir ? 'dir' : lStats.size, - 'uid' : lStats.uid, - 'mode' : lMode}; - - lJSON[i+1] = lJSONFile; - } - - /* если js недоступен - * или отключен выcылаем html-код - * и прописываем соответствующие заголовки - */ - if(CloudServer.NoJS){ - var lPanel = CloudFunc.buildFromJSON(lJSON); - lList = '' + - ''; - - Fs.readFile(CloudServer.INDEX, CloudServer.indexReaded(lList)); - - }else{ - DirPath = DirPath.substr(DirPath, DirPath.lastIndexOf('/') ); - - var lQuyery = CloudServer.Queries[DirPath]; - DirPath += '.json'; - CloudServer.Queries[DirPath] = lQuyery; - - /* в обычном режиме(когда js включен - * высылаем json-структуру файлов - * с соответствующими заголовками - */ - lList = JSON.stringify(lJSON); - lHeader = main.generateHeaders(DirPath, CloudServer.Gzip, lQuyery); - - /* если браузер поддерживает gzip-сжатие - сжимаем данные*/ - if(CloudServer.Gzip){ - var lGzipCB = CloudServer.getGzipDataFunc(lHeader, CloudServer.INDEX); - - Zlib.gzip(lList, lGzipCB); - } - /* если не поддерживаеться - отсылаем данные без сжатия*/ - else - CloudServer.sendResponse(lHeader, lList, CloudServer.INDEX); - } - }; - - /** - *@param pList - */ - CloudServer.indexReaded = function(pList){ - return function(pError, pIndex){ - if(pError){ - return Util.log(pError); - } - - var lSrv = CloudServer, - lIndexName = lSrv.INDEX; - - pIndex = pIndex.toString(); - - - var lProccessed, - lIndexProccessing = lSrv.indexProcessing; - - lProccessed = Util.exec(lIndexProccessing, { - data : pIndex, - additional : pList + }, function(pCallBack){ + Minify.optimize(lName, { + request : pReq, + response : pRes, + callback : pCallBack }); - - if(lProccessed) - pIndex = lProccessed; - /* - * если браузер поддерживает gzip-сжатие - * высылаем заголовок в зависимости от типа файла - */ - var lQuery = lSrv.Queries[lIndexName], - lHeader = main.generateHeaders(lIndexName, lSrv.Gzip, lQuery); - - /* если браузер поддерживает gzip-сжатие - сжимаем данные*/ - if(lSrv.Gzip) { - Zlib.gzip(pIndex, - lSrv.getGzipDataFunc(lHeader, lIndexName)); - } - - /* если не поддерживаеться - отсылаем данные без сжатия*/ - else - lSrv.sendResponse(lHeader, pIndex, lIndexName); - }; - }; - - /** - * Функция генерирует функцию считывания файла - * таким образом, что бы у нас было - * имя считываемого файла - * @param pName - полное имя файла - */ - CloudServer.getReadFileFunc = function(pName){ - /* - * @pError - ошибка - * @pData - данные - * или из одного из кешей - */ - var lReadFile = function(pError, pData){ - var lSrv = CloudServer; - if (!pError){ - Util.log('file ' + pName + ' readed'); - - var lQuery = lSrv.Queries[pName], - lHeader = main.generateHeaders(pName, lSrv.Gzip, lQuery); - - /* если браузер поддерживает gzip-сжатие - сжимаем данные*/ - if( lSrv.Gzip ) - /* сжимаем содержимое */ - Zlib.gzip(pData, lSrv.getGzipDataFunc(lHeader, pName)); - else - /* высылаем несжатые данные */ - lSrv.sendResponse(lHeader, pData, pName); - } - else{ - Util.log(pError.path); - if(pError.path !== 'passwd.json'){ - Util.log(pError); - - /* sending page not found */ - lSrv.Statuses[pName] = 404; - lSrv.sendResponse(null, pError.toString(), pName); - }else - lSrv.sendResponse(null, 'passwd.json'); - } - }; - - return lReadFile; - }; - - /** - * Функция получает сжатые данные - * @param pHeader - заголовок файла - * @pName - */ - CloudServer.getGzipDataFunc = function(pHeader, pName){ - return function(error, pResult){ - if(!error) - CloudServer.sendResponse(pHeader, pResult, pName); - else{ - Util.log(error); - CloudServer.sendResponse(pHeader, error); - } - }; - }; - /** - * Функция высылает ответ серверу - * @param pHead - заголовок - * @param Data - данные - * @param pName - имя отсылаемого файла - */ - CloudServer.sendResponse = function(pHead, pData, pName){ - /* если у нас есть указатель на responce - * для соответствующего файла - - * высылаем его - */ - var lResponse = CloudServer.Responses[pName], - lStatus = CloudServer.Statuses[pName]; - - if(lResponse){ - lResponse.writeHead(lStatus, pHead); - lResponse.end(pData); - - Util.log(pName + ' sended'); - } + }); }; /** diff --git a/lib/server/commander.js b/lib/server/commander.js index 08433ebc..007fdb18 100644 --- a/lib/server/commander.js +++ b/lib/server/commander.js @@ -136,7 +136,8 @@ }); } - /** async getting file states + /** + * async getting file states * and putting it to lStats object */ function getFilesStat(pParams){