mirror of
https://github.com/coderaiser/cloudcmd.git
synced 2026-07-20 18:18:56 +00:00
refactored
This commit is contained in:
parent
d9aa10f53d
commit
273c62291d
4 changed files with 212 additions and 295 deletions
86
cloudcmd.js
86
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 = '<ul id=left class=panel>' + lPanel + '</ul>' +
|
||||
'<ul id=right class=panel>' + lPanel + '</ul>';
|
||||
|
||||
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/');
|
||||
|
|
|
|||
|
|
@ -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 = '<ul id=left class=panel>' + lPanel + '</ul>' +
|
||||
'<ul id=right class=panel>' + lPanel + '</ul>';
|
||||
|
||||
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 += '/';
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue