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);
}
}