diff --git a/cloudcmd.js b/cloudcmd.js index cd21d61f..896788d3 100644 --- a/cloudcmd.js +++ b/cloudcmd.js @@ -196,7 +196,17 @@ main.sendFile(pParams); lRet = true; - } + }else if( Util.isContainStr(lName, [CloudFunc.Fs, CloudFunc.NoJS] ) && + Util.strCmp(lName, '/') && + Util.strCmp(lName, 'json') ) { + main.commander({ + request : pParams.request, + response : pParams.response, + indexProcessing : indexProcessing + }); + + lRet = true; + } return lRet; } diff --git a/lib/server/commander.js b/lib/server/commander.js index 31d98451..73375965 100644 --- a/lib/server/commander.js +++ b/lib/server/commander.js @@ -25,27 +25,147 @@ NO_JS = CloudFunc.NoJS, FS = CloudFunc.Fs, - INDEX = HTMLDIR + 'index.html'; - - - exports.sendContent = function(pParams){ - var lRet, - lReq, lRes; + INDEX = HTMLDIR + 'index.html', - if(pParams){ - lReq = pParams.request, - lRes = pParams.response; + IndexProcessingFunc = null; + + function getQuery(pReq){ + var lQuery, lParsedUrl; + + if(pReq){ + lParsedUrl = url.parse(pReq.url); + lQuery = lParsedUrl.query; } - if(lReq && lRes){ - var lPath = getCleanPath(lReq); + return lQuery; + } + + function getPath(pReq){ + var lParsedUrl = url.parse(pReq.url), + lPath = lParsedUrl.pathname; + + return lPath; + } + + function getDirPath(pReq){ + var lPath = getPath(pReq); + + /* Если мы не в корне добавляем слеш к будующим ссылкам */ + if(lPath !== '/') + lPath += '/'; + + return lPath; + } + + function getCleanPath(pReq){ + var lPath = getPath(pReq), + lRet = Util.removeStr(lPath, [NO_JS, FS]) || '/'; + + return lRet; + } + + function call(pFunc, pParams){ + var lFunc = function(pError, pData){ + Util.exec(pFunc, { + error : pError, + data : pData, + params : pParams + }); + }; + + return lFunc; + } + + function noJS(pReq){ + var lNoJS, lPath; + + if(pReq){ + lPath = getPath(pReq); + + lNoJS = Util.isContainStr(lPath, CloudFunc.NoJS) + && lPath === '/' && getQuery() !== 'json'; + } + + return lNoJS; + } + + function isGZIP(pReq){ + var lEnc, lGZIP; + if(pReq){ + lEnc = pReq.headers['accept-encoding'] || '', + lGZIP = lEnc.match(/\bgzip\b/); + } + + return lGZIP; + } + + /** + * Функция высылает ответ серверу + * @param pHead - заголовок + * @param Data - данные + * @param pName - имя отсылаемого файла + */ + function sendResponse(pParams){ + var lRet = Util.checkObjTrue(pParams, + ['name', 'data', 'request', 'response']); + + if(lRet){ + var p = pParams; + + var lPath = p.name || getCleanPath(p.request), + lQuery = getQuery(p.request), + /* download, json */ + lGzip = isGZIP(p.request), + lHead = main.generateHeaders(lPath, lGzip, lQuery); + + /* если браузер поддерживает gzip-сжатие - сжимаем данные*/ + Util.ifExec(!lGzip, + function(pParams){ + var lRet = Util.checkObj(pParams, ['status', 'data']); + + if(lRet){ + p.status = pParams.status; + p.data = pParams.data; + } + + p.response.writeHead(p.status || OK, lHead); + p.request.end(); + + Util.log(lPath + ' sended'); + Util.log( p.status === NOT_FOUND && p.data ); + }, + + function(pCallBack){ + zlib.gzip (call(gzipData, { + callback : pCallBack, + data : p.data + })); + }); + } + } + + exports.sendContent = function(pParams){ + var lRet = Util.checkObj(pParams, + ['processing'], + ['request', 'response']); + + if(lRet){ + var lReq = pParams.request, + lRes = pParams.response, + lPath = getCleanPath(lReq); + + IndexProcessingFunc = pParams.processing; fs.stat(lPath, function(pError, pStat){ if(!pError) if(pStat.isDirectory()) fs.readdir(lPath, call(readDir, pParams) ); else - fs.readFile(lPath, getReadFileFunc(lPath)); + main.sendFile({ + name : lPath, + request : lReq, + response : lRes + }); else sendResponse({ status : NOT_FOUND, @@ -147,7 +267,7 @@ }; Util.exec(lCallBack); - }; + } /** * Function fill JSON by file stats @@ -182,7 +302,7 @@ size : 'dir' }; - for( i = 0; i < n; i++){ + for( i = 0; i < n; i++ ){ /* *Переводим права доступа в 8-ричную систему */ @@ -212,7 +332,12 @@ lList = '' + ''; - fs.readFile(INDEX, indexReaded(lList)); + fs.readFile(INDEX, call(readFile, { + list : lList, + request : lReq, + response : lRes + }) + ); }else{ lDirPath = lDirPath.substr(lDirPath, lDirPath.lastIndexOf('/') ); @@ -222,99 +347,61 @@ * с соответствующими заголовками */ lList = JSON.stringify(lJSON); - - /* если браузер поддерживает gzip-сжатие - сжимаем данные*/ - if( isGZIP(lReq) ){ - zlib.gzip(lList, call(lGzipCB, { - - })); - } - /* если не поддерживаеться - отсылаем данные без сжатия*/ - else - sendResponse({ - name : INDEX, - data : lList, - request : lReq, - response: lRes - }); + + sendResponse({ + name : INDEX, + data : lList, + request : lReq, + response: lRes + }); } } - /** - *@param pList - */ - function indexReaded(pList){ - return function(pError, pIndex){ - if(pError){ - return Util.log(pError); - } - - pIndex = pIndex.toString(); - - - var lProccessed = Util.exec(lIndexProccessing, { - data : pIndex, - additional : pList - }); - - if(lProccessed) - pIndex = lProccessed; - - /* если браузер поддерживает gzip-сжатие - сжимаем данные*/ - if (isGZIP(lReq) ) { - zlib.gzip(pIndex, - call (gzipData, { - request : lReq, - response: lRes - })); - } - - /* если не поддерживаеться - отсылаем данные без сжатия*/ - else - sendResponse({ - name : INDEX, - data : pIndex, - request : lReq, - response: lRes - }); - }; - } /** * Функция генерирует функцию считывания файла - * таким образом, что бы у нас было + * таким образом, что бы у нас было * имя считываемого файла * @param pName - полное имя файла */ - function getReadFileFunc(pName){ - var lReadFile = function(pError, pData){ - if (!pError){ - Util.log('file ' + pName + ' readed'); + function readFile(pParams){ + var lRet = Util.checkObj(pParams, + ['error', 'data']); + + if(lRet) + lRet = Util.checkObj(pParams.params, + ['callback'], ['request', 'response', 'name', 'list']); + + if(lRet){ + var p = pParams, + c = pParams.params, + lParams = { + request : c.request, + response: c.response + }, - - /* если браузер поддерживает gzip-сжатие - сжимаем данные*/ - if( isGZIP(lReq) ) - zlib.gzip(pData, call(gzipData, lParams)); - else - sendResponse({ - name : pName, - data : pData, - request : lReq, - response: lRes - }); - } - else - sendResponse({ - name : pName, - status : NOT_FOUND, - data : pError.toString(), - request : lReq, - response: lRes + lProccessed = Util.exec(IndexProcessingFunc, { + data : p.data, + additional : c.list }); - return lReadFile; - }; + if(lProccessed) + p.data = lProccessed; + + if (!p.Error){ + lParams.name = c.Name; + lParams.data = p.data; + + Util.log('file ' + c.name + ' readed'); + } + else{ + lParams.status = NOT_FOUND; + lParams.data = p.error.toString(); + } + + sendResponse(lParams); + } } /** @@ -323,150 +410,29 @@ * @pName */ function gzipData(pParams){ - var lError, lResult, - lSendData, lData, lName, lReq, lRes; + var lRet = Util.checkObj(pParams, + ['error', 'data']); - if(pParams){ - lError = pParams.error; - lResult = pParams.data; + if(lRet) + lRet = Util.checkObj(pParams.params, + ['callback'], ['name']); + + if(lRet){ + var p = pParams, + c = pParams.params, + lData = {}; - lData = pParams.params; - - if(lData){ - lReq = lSendData.request, - lRes = lSendData.response; - lName = lSendData.name; + if(!p.error){ + lData.name = c.name; + lData.data = p.data; + } + else{ + lData.status = NOT_FOUND, + lData.data = p.error.toString(), } - } - lSendData = { - request : lReq, - response: lRes - }; - - if(!lError){ - lSendData.name = lName; - lSendData.data = lResult; + Util.exec(c.callback, lData); } - else{ - lSendData.status = NOT_FOUND, - lSendData.data = lError.toString(), - } - - sendResponse(lSendData); - } - - /** - * Функция высылает ответ серверу - * @param pHead - заголовок - * @param Data - данные - * @param pName - имя отсылаемого файла - */ - function sendResponse(pParams){ - var lName, lData, lReq, lRes, lStatus; - - if(pParams){ - lName = pParams.name; - lData = pParams.data; - lReq = pParams.request, - lRes = pParams.response; - lStatus = pParams.status || OK; - } - - if(lStatus === NOT_FOUND) - Util.log(lData); - - if(lRes && lReq){ - /* 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 - */ - var lPath = lName || getCleanPath(lReq), - lQuery = getQuery(lReq), - lGzip = isGZIP(lReq), - lHead = main.generateHeaders(lPath, lGzip, lQuery); - - lRes.writeHead(lStatus, lHead); - lRes.end(lData); - - Util.log(lPath + ' sended'); - } - } - - function getQuery(pReq){ - var lQuery, lParsedUrl; - - if(pReq){ - lParsedUrl = url.parse(pReq.url); - lQuery = lParsedUrl.query; - } - - return lQuery; - } - - function getPath(pReq){ - var lParsedUrl = url.parse(pReq.url), - lPath = lParsedUrl.pathname; - - return lPath; - } - - function getDirPath(pReq){ - var lPath = getPath(pReq); - - /* Если мы не в корне добавляем слеш к будующим ссылкам */ - if(lPath !== '/') - lPath += '/'; - - return lPath; - } - - function getCleanPath(pReq){ - var lPath = getPath(pReq), - lRet = Util.removeStr(lPath, [NO_JS, FS]) || '/'; - - return lRet; - } - - function call(pFunc, pParams){ - var lFunc = function(pError, pData){ - Util.exec(pFunc, { - error : pError, - data : pData, - params : pParams - }); - }; - - return lFunc; - } - - function noJS(pReq){ - var lNoJS, lPath; - - if(pReq){ - lPath = getPath(pReq); - - lNoJS = Util.isContainStr(lPath, CloudFunc.NoJS) - && lPath === '/' && getQuery() !== 'json'; - } - - return lNoJS; - } - - function isGZIP(pReq){ - var lEnc, lGZIP; - if(pReq){ - lEnc = pReq.headers['accept-encoding'] || '', - lGZIP = lEnc.match(/\bgzip\b/); - } - - return lGZIP; } })(); \ No newline at end of file diff --git a/lib/server/main.js b/lib/server/main.js index f85a7511..5ce87e9d 100644 --- a/lib/server/main.js +++ b/lib/server/main.js @@ -86,6 +86,7 @@ exports.update = srvrequire('update'), exports.ischanged = srvrequire('ischanged'); exports.minify = srvrequire('minify').Minify; + exports.commander = srvrequire('commander'); /* * second initializing after all modules load, so global var is * totally filled of all information that should know all modules diff --git a/lib/util.js b/lib/util.js index 1997ef8a..bc06c648 100644 --- a/lib/util.js +++ b/lib/util.js @@ -39,7 +39,7 @@ Util = exports || {}; * @param pName - получает имя файла * @param pExt - расширение */ - Util.checkExtension = function(pName, pExt){ + Util.checkExtension = function(pName, pExt){ var lRet = false, lLength = pName.length; /* длина имени*/ /* если длина имени больше @@ -65,7 +65,65 @@ Util = exports || {}; return lRet; }; - /** for function + + /** + * Check is Properties exists and they are true if neaded + * + * @param pObj + * @param pPropArr + * @param pTrueArr + */ + Util.checkObj = function(pObj, pPropArr, pTrueArr){ + var lRet = Util.isObject(pObj), + i, n; + if( lRet ){ + lRet = Util.isArray(pPropArr); + if(lRet){ + n = pPropArr.length; + for(i = 0; i < n; i++){ + var lProp = pPropArr[i]; + lRet = pObj.hasOwnProperty( lProp ); + if(!lRet){ + Util.logError(lProp + ' not in Obj!'); + Util.log(pObj); + break; + } + } + } + + if( lRet && Util.isArray(pTrueArr) ) + lRet = Util.checkObjTrue( pObj, pTrueArr ); + } + + return lRet; + }; + + /** + * Check is Properties exists and they are true + * + * @param pObj + * @param pPropArr + * @param pTrueArr + */ + Util.checkObjTrue = function(pObj, pTrueArr){ + var lRet = Util.isObject(pObj), + i, n; + if( lRet ){ + lRet = Util.isArray(pTrueArr); + if(lRet){ + n = pTrueArr.length; + for(i = 0; i < n; i++){ + lRet = pObj[pTrueArr]; + if( !lRet) + break; + } + } + } + + return lRet; + }; + + /** for function * @param pI * @param pN * @param pFunc