123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- /**
- * 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;
- };
|