108 lines
2.1 KiB
JavaScript
108 lines
2.1 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
/**
|
||
|
* Module dependencies.
|
||
|
*/
|
||
|
// eslint-disable-next-line node/no-deprecated-api
|
||
|
var _require = require('url'),
|
||
|
parse = _require.parse;
|
||
|
|
||
|
var _require2 = require('cookiejar'),
|
||
|
CookieJar = _require2.CookieJar;
|
||
|
|
||
|
var _require3 = require('cookiejar'),
|
||
|
CookieAccessInfo = _require3.CookieAccessInfo;
|
||
|
|
||
|
var methods = require('methods');
|
||
|
|
||
|
var request = require('../..');
|
||
|
|
||
|
var AgentBase = require('../agent-base');
|
||
|
/**
|
||
|
* Expose `Agent`.
|
||
|
*/
|
||
|
|
||
|
|
||
|
module.exports = Agent;
|
||
|
/**
|
||
|
* Initialize a new `Agent`.
|
||
|
*
|
||
|
* @api public
|
||
|
*/
|
||
|
|
||
|
function Agent(options) {
|
||
|
if (!(this instanceof Agent)) {
|
||
|
return new Agent(options);
|
||
|
}
|
||
|
|
||
|
AgentBase.call(this);
|
||
|
this.jar = new CookieJar();
|
||
|
|
||
|
if (options) {
|
||
|
if (options.ca) {
|
||
|
this.ca(options.ca);
|
||
|
}
|
||
|
|
||
|
if (options.key) {
|
||
|
this.key(options.key);
|
||
|
}
|
||
|
|
||
|
if (options.pfx) {
|
||
|
this.pfx(options.pfx);
|
||
|
}
|
||
|
|
||
|
if (options.cert) {
|
||
|
this.cert(options.cert);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Agent.prototype = Object.create(AgentBase.prototype);
|
||
|
/**
|
||
|
* Save the cookies in the given `res` to
|
||
|
* the agent's cookie jar for persistence.
|
||
|
*
|
||
|
* @param {Response} res
|
||
|
* @api private
|
||
|
*/
|
||
|
|
||
|
Agent.prototype._saveCookies = function (res) {
|
||
|
var cookies = res.headers['set-cookie'];
|
||
|
if (cookies) this.jar.setCookies(cookies);
|
||
|
};
|
||
|
/**
|
||
|
* Attach cookies when available to the given `req`.
|
||
|
*
|
||
|
* @param {Request} req
|
||
|
* @api private
|
||
|
*/
|
||
|
|
||
|
|
||
|
Agent.prototype._attachCookies = function (req) {
|
||
|
var url = parse(req.url);
|
||
|
var access = new CookieAccessInfo(url.hostname, url.pathname, url.protocol === 'https:');
|
||
|
var cookies = this.jar.getCookies(access).toValueString();
|
||
|
req.cookies = cookies;
|
||
|
};
|
||
|
|
||
|
methods.forEach(function (name) {
|
||
|
var method = name.toUpperCase();
|
||
|
|
||
|
Agent.prototype[name] = function (url, fn) {
|
||
|
var req = new request.Request(method, url);
|
||
|
req.on('response', this._saveCookies.bind(this));
|
||
|
req.on('redirect', this._saveCookies.bind(this));
|
||
|
req.on('redirect', this._attachCookies.bind(this, req));
|
||
|
|
||
|
this._attachCookies(req);
|
||
|
|
||
|
this._setDefaults(req);
|
||
|
|
||
|
if (fn) {
|
||
|
req.end(fn);
|
||
|
}
|
||
|
|
||
|
return req;
|
||
|
};
|
||
|
});
|
||
|
Agent.prototype.del = Agent.prototype.delete;
|