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