1
0
mirror of https://tt-rss.org/git/tt-rss.git synced 2024-07-07 13:40:53 +02:00
ttrss/lib/dojo/request/node.js.uncompressed.js
2013-03-18 10:26:26 +04:00

192 lines
5.0 KiB
JavaScript

define("dojo/request/node", [
'require',
'./util',
'./handlers',
'../errors/RequestTimeoutError',
'../node!http',
'../node!https',
'../node!url',
'../node!stream'/*=====,
'../request',
'../_base/declare' =====*/
], function(require, util, handlers, RequestTimeoutError, http, https, URL, stream/*=====, request, declare =====*/){
var Stream = stream.Stream,
undefined;
var defaultOptions = {
method: 'GET',
query: null,
data: undefined,
headers: {}
};
function node(url, options){
var response = util.parseArgs(url, util.deepCreate(defaultOptions, options), options && options.data instanceof Stream);
url = response.url;
options = response.options;
var def = util.deferred(
response,
function(dfd, response){
response.clientRequest.abort();
}
);
url = URL.parse(url);
var reqOptions = response.requestOptions = {
hostname: url.hostname,
port: url.port,
socketPath: options.socketPath,
method: options.method,
headers: options.headers,
agent: options.agent,
pfx: options.pfx,
key: options.key,
passphrase: options.passphrase,
cert: options.cert,
ca: options.ca,
ciphers: options.ciphers,
rejectUnauthorized: options.rejectUnauthorized === false ? false : true
};
if(url.path){
reqOptions.path = url.path;
}
if(options.user || options.password){
reqOptions.auth = (options.user||'') + ':' + (options.password||'');
}
var req = response.clientRequest = (url.protocol === 'https:' ? https : http).request(reqOptions);
if(options.socketOptions){
if('timeout' in options.socketOptions){
req.setTimeout(options.socketOptions.timeout);
}
if('noDelay' in options.socketOptions){
req.setNoDelay(options.socketOptions.noDelay);
}
if('keepAlive' in options.socketOptions){
var initialDelay = options.socketOptions.keepAlive;
req.setKeepAlive(initialDelay >= 0, initialDelay || 0);
}
}
req.on('socket', function(){
response.hasSocket = true;
def.progress(response);
});
req.on('response', function(clientResponse){
response.clientResponse = clientResponse;
response.status = clientResponse.statusCode;
response.getHeader = function(headerName){
return clientResponse.headers[headerName.toLowerCase()] || null;
};
var body = [];
clientResponse.on('data', function(chunk){
body.push(chunk);
// TODO: progress updates via the deferred
});
clientResponse.on('end', function(){
if(timeout){
clearTimeout(timeout);
}
response.text = body.join('');
handlers(response);
def.resolve(response);
});
});
req.on('error', def.reject);
if(options.data){
if(typeof options.data === "string"){
req.end(options.data);
}else{
options.data.pipe(req);
}
}else{
req.end();
}
if(options.timeout){
var timeout = setTimeout(function(){
def.cancel(new RequestTimeoutError(response));
}, options.timeout);
}
return def.promise;
}
/*=====
node = function(url, options){
// summary:
// Sends a request using the included http or https interface from node.js
// with the given URL and options.
// url: String
// URL to request
// options: dojo/request/node.__Options?
// Options for the request.
// returns: dojo/request.__Promise
};
node.__BaseOptions = declare(request.__BaseOptions, {
// data: String|Object|Stream?
// Data to transfer. This is ignored for GET and DELETE
// requests.
// headers: Object?
// Headers to use for the request.
// user: String?
// Username to use during the request.
// password: String?
// Password to use during the request.
});
node.__MethodOptions = declare(null, {
// method: String?
// The HTTP method to use to make the request. Must be
// uppercase. Default is `"GET"`.
});
node.__Options = declare([node.__BaseOptions, node.__MethodOptions]);
node.get = function(url, options){
// summary:
// Send an HTTP GET request using XMLHttpRequest with the given URL and options.
// url: String
// URL to request
// options: dojo/request/node.__BaseOptions?
// Options for the request.
// returns: dojo/request.__Promise
};
node.post = function(url, options){
// summary:
// Send an HTTP POST request using XMLHttpRequest with the given URL and options.
// url: String
// URL to request
// options: dojo/request/node.__BaseOptions?
// Options for the request.
// returns: dojo/request.__Promise
};
node.put = function(url, options){
// summary:
// Send an HTTP PUT request using XMLHttpRequest with the given URL and options.
// url: String
// URL to request
// options: dojo/request/node.__BaseOptions?
// Options for the request.
// returns: dojo/request.__Promise
};
node.del = function(url, options){
// summary:
// Send an HTTP DELETE request using XMLHttpRequest with the given URL and options.
// url: String
// URL to request
// options: dojo/request/node.__BaseOptions?
// Options for the request.
// returns: dojo/request.__Promise
};
=====*/
util.addCommonMethods(node);
return node;
});