mirror of
https://github.com/coderaiser/cloudcmd.git
synced 2026-01-23 02:35:49 +00:00
refactored
This commit is contained in:
parent
dc974abbaf
commit
79c11fd3b8
4 changed files with 43 additions and 418 deletions
11
cloudcmd.js
11
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
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
"minification" : {
|
||||
"js" : false,
|
||||
"css" : true,
|
||||
"html" : false,
|
||||
"html" : true,
|
||||
"img" : true
|
||||
},
|
||||
"logs" : false,
|
||||
|
|
|
|||
445
lib/server.js
445
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 = '<ul id=left class=panel>' + lPanel + '</ul>' +
|
||||
'<ul id=right class=panel>' + lPanel + '</ul>';
|
||||
|
||||
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');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -136,7 +136,8 @@
|
|||
});
|
||||
}
|
||||
|
||||
/** async getting file states
|
||||
/**
|
||||
* async getting file states
|
||||
* and putting it to lStats object
|
||||
*/
|
||||
function getFilesStat(pParams){
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue