192 lines
5.0 KiB
JavaScript
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;
|
||
|
});
|