refactored

This commit is contained in:
coderaiser 2013-02-05 03:40:14 -05:00
parent dc974abbaf
commit 79c11fd3b8
4 changed files with 43 additions and 418 deletions

View file

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

View file

@ -4,7 +4,7 @@
"minification" : {
"js" : false,
"css" : true,
"html" : false,
"html" : true,
"img" : true
},
"logs" : false,

View file

@ -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');
}
});
};
/**

View file

@ -136,7 +136,8 @@
});
}
/** async getting file states
/**
* async getting file states
* and putting it to lStats object
*/
function getFilesStat(pParams){