102 lines
2.5 KiB
JavaScript
102 lines
2.5 KiB
JavaScript
|
|
||
|
/**
|
||
|
* Module dependencies.
|
||
|
*/
|
||
|
|
||
|
require('./patch-core');
|
||
|
var extend = require('extend');
|
||
|
var inherits = require('util').inherits;
|
||
|
var EventEmitter = require('events').EventEmitter;
|
||
|
|
||
|
/**
|
||
|
* Module exports.
|
||
|
*/
|
||
|
|
||
|
module.exports = Agent;
|
||
|
|
||
|
/**
|
||
|
* Base `http.Agent` implementation.
|
||
|
* No pooling/keep-alive is implemented by default.
|
||
|
*
|
||
|
* @param {Function} callback
|
||
|
* @api public
|
||
|
*/
|
||
|
|
||
|
function Agent (callback) {
|
||
|
if (!(this instanceof Agent)) return new Agent(callback);
|
||
|
if ('function' != typeof callback) throw new Error('Must pass a "callback function"');
|
||
|
EventEmitter.call(this);
|
||
|
this.callback = callback;
|
||
|
}
|
||
|
inherits(Agent, EventEmitter);
|
||
|
|
||
|
/**
|
||
|
* Called by node-core's "_http_client.js" module when creating
|
||
|
* a new HTTP request with this Agent instance.
|
||
|
*
|
||
|
* @api public
|
||
|
*/
|
||
|
|
||
|
Agent.prototype.addRequest = function (req, host, port, localAddress) {
|
||
|
var opts;
|
||
|
if ('object' == typeof host) {
|
||
|
// >= v0.11.x API
|
||
|
opts = extend({}, req._options, host);
|
||
|
} else {
|
||
|
// <= v0.10.x API
|
||
|
opts = extend({}, req._options, { host: host, port: port });
|
||
|
if (null != localAddress) {
|
||
|
opts.localAddress = localAddress;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (opts.host && opts.path) {
|
||
|
// if both a `host` and `path` are specified then it's most likely the
|
||
|
// result of a `url.parse()` call... we need to remove the `path` portion so
|
||
|
// that `net.connect()` doesn't attempt to open that as a unix socket file.
|
||
|
delete opts.path;
|
||
|
}
|
||
|
|
||
|
// set default `port` if none was explicitly specified
|
||
|
if (null == opts.port) {
|
||
|
opts.port = opts.secureEndpoint ? 443 : 80;
|
||
|
}
|
||
|
|
||
|
delete opts.agent;
|
||
|
delete opts.hostname;
|
||
|
delete opts._defaultAgent;
|
||
|
delete opts.defaultPort;
|
||
|
delete opts.createConnection;
|
||
|
|
||
|
// hint to use "Connection: close"
|
||
|
// XXX: non-documented `http` module API :(
|
||
|
req._last = true;
|
||
|
req.shouldKeepAlive = false;
|
||
|
|
||
|
// clean up a bit of memory since we're no longer using this
|
||
|
req._options = null;
|
||
|
|
||
|
// create the `net.Socket` instance
|
||
|
var sync = true;
|
||
|
this.callback(req, opts, function (err, socket) {
|
||
|
function emitErr () {
|
||
|
req.emit('error', err);
|
||
|
// For Safety. Some additional errors might fire later on
|
||
|
// and we need to make sure we don't double-fire the error event.
|
||
|
req._hadError = true;
|
||
|
}
|
||
|
if (err) {
|
||
|
if (sync) {
|
||
|
// need to defer the "error" event, when sync, because by now the `req`
|
||
|
// instance hasn't event been passed back to the user yet...
|
||
|
process.nextTick(emitErr);
|
||
|
} else {
|
||
|
emitErr();
|
||
|
}
|
||
|
} else {
|
||
|
req.onSocket(socket);
|
||
|
}
|
||
|
});
|
||
|
sync = false;
|
||
|
};
|