var URL = require('url'); var tc = require('tough-cookie'); var Cookie = require('./cookie'); var noop = function(){}; /** * Holds cookies * @param {Object} store [optional] the toJSON value of another CookieJar * @constructor */ var CookieJar = function(store) { this._jar = new tc.CookieJar(); if (store) this._jar.store.idx = store; }; /** * Add a cookie to the cookie jar * @param {String|Object} data can be a Cookie|json object or a set-cookie * header string * @param {String} url * @param {Object} options [optional] */ CookieJar.prototype.add = function(data, url, options) { if (!options) options = {}; if (data instanceof Cookie) { this._jar.setCookieSync(data._cookie, url, options); } else if (typeof data === 'object' || typeof data === 'string') { this._jar.setCookieSync(new Cookie(data)._cookie, url, options); } }; /** * Remove a cookie by name for a given domain. If the key then all cookies for * the given domain and path (if given) will be removed. Note: when cookies * are added without a path specified the default path is "/" in accordance * with http://tools.ietf.org/search/rfc6265#section-5.1.4 - so you should use * that for the path param when appropriate. * @param {String} url * @param {String} key */ CookieJar.prototype.remove = function(url, key) { var domain = null; var path ='/'; var urlInfo = URL.parse(url); if (!urlInfo.protocol) { domain = urlInfo; } else { domain = urlInfo.host; path = urlInfo.path; } if (key) { this._jar.store.removeCookie(domain, path, key, noop); } else { this._jar.store.removeCookies(domain, path, noop); } }; /** * Get cookies that match the given properties * @param {String} url * @param {Object} options [optional] * @return {Array} array of Cookie objects */ CookieJar.prototype.getCookies = function(url, options) { if (!options) options = {}; // get tough cookies, wrap w/Cookie, return array of Cookie objects var tcCookies = this._jar.getCookiesSync(url, options); var cookies = []; for (var i=0, len = tcCookies.length; i<len; i++) { cookies.push(new Cookie(tcCookies[i])); }; return cookies; }; /** * Get HTTP Cookie header string * @param {String} url * @param {Object} options [optional] * @return {String} HTTP Cookie header string */ CookieJar.prototype.getCookieHeaderString = function(url, options) { if (!options) options = {}; return this._jar.getCookieStringSync(url, options); }; /** * Get cookie jar as a JSON object * @return {Object} */ CookieJar.prototype.toJSON = function() { return this._jar.store.idx; }; module.exports = CookieJar;