refactored

This commit is contained in:
coderaiser 2013-02-04 06:17:09 -05:00
parent a0f0d08b53
commit 43bd558f4a
4 changed files with 272 additions and 237 deletions

View file

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

View file

@ -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 = '<ul id=left class=panel>' + lPanel + '</ul>' +
'<ul id=right class=panel>' + lPanel + '</ul>';
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;
}
})();

View file

@ -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

View file

@ -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