tt-rss/lib/dojo/request/util.js.uncompressed.js
2013-03-18 10:26:26 +04:00

145 lines
3.7 KiB
JavaScript

define("dojo/request/util", [
'exports',
'../errors/RequestError',
'../errors/CancelError',
'../Deferred',
'../io-query',
'../_base/array',
'../_base/lang'
], function(exports, RequestError, CancelError, Deferred, ioQuery, array, lang){
exports.deepCopy = function deepCopy(target, source){
for(var name in source){
var tval = target[name],
sval = source[name];
if(tval !== sval){
if(tval && typeof tval === 'object' && sval && typeof sval === 'object'){
exports.deepCopy(tval, sval);
}else{
target[name] = sval;
}
}
}
return target;
};
exports.deepCreate = function deepCreate(source, properties){
properties = properties || {};
var target = lang.delegate(source),
name, value;
for(name in source){
value = source[name];
if(value && typeof value === 'object'){
target[name] = exports.deepCreate(value, properties[name]);
}
}
return exports.deepCopy(target, properties);
};
var freeze = Object.freeze || function(obj){ return obj; };
function okHandler(response){
return freeze(response);
}
exports.deferred = function deferred(response, cancel, isValid, isReady, handleResponse, last){
var def = new Deferred(function(reason){
cancel && cancel(def, response);
if(!reason || !(reason instanceof RequestError) && !(reason instanceof CancelError)){
return new CancelError('Request canceled', response);
}
return reason;
});
def.response = response;
def.isValid = isValid;
def.isReady = isReady;
def.handleResponse = handleResponse;
function errHandler(error){
error.response = response;
throw error;
}
var responsePromise = def.then(okHandler).otherwise(errHandler);
if(exports.notify){
responsePromise.then(
lang.hitch(exports.notify, 'emit', 'load'),
lang.hitch(exports.notify, 'emit', 'error')
);
}
var dataPromise = responsePromise.then(function(response){
return response.data || response.text;
});
var promise = freeze(lang.delegate(dataPromise, {
response: responsePromise
}));
if(last){
def.then(function(response){
last.call(def, response);
}, function(error){
last.call(def, response, error);
});
}
def.promise = promise;
def.then = promise.then;
return def;
};
exports.addCommonMethods = function addCommonMethods(provider, methods){
array.forEach(methods||['GET', 'POST', 'PUT', 'DELETE'], function(method){
provider[(method === 'DELETE' ? 'DEL' : method).toLowerCase()] = function(url, options){
options = lang.delegate(options||{});
options.method = method;
return provider(url, options);
};
});
};
exports.parseArgs = function parseArgs(url, options, skipData){
var data = options.data,
query = options.query;
if(data && !skipData){
if(typeof data === 'object'){
options.data = ioQuery.objectToQuery(data);
}
}
if(query){
if(typeof query === 'object'){
query = ioQuery.objectToQuery(query);
}
if(options.preventCache){
query += (query ? '&' : '') + 'request.preventCache=' + (+(new Date));
}
}else if(options.preventCache){
query = 'request.preventCache=' + (+(new Date));
}
if(url && query){
url += (~url.indexOf('?') ? '&' : '?') + query;
}
return {
url: url,
options: options,
getHeader: function(headerName){ return null; }
};
};
exports.checkStatus = function(stat){
stat = stat || 0;
return (stat >= 200 && stat < 300) || // allow any 2XX response code
stat === 304 || // or, get it out of the cache
stat === 1223 || // or, Internet Explorer mangled the status code
!stat; // or, we're Titanium/browser chrome/chrome extension requesting a local file
};
});