UNPKG

xmlrpc-rosnodejs

Version:

A pure JavaScript XML-RPC client and server. Patched fork from https://github.com/baalexander/node-xmlrpc.

112 lines (101 loc) 3.27 kB
/** * Creates object for cookies manipulation on client side. * Allows to parse server's response in order to get cookies and compose http request to transfer cookies to the server * @constructor */ function Cookies() { this.cookies = {} } Cookies.prototype = { /** * Obtains value of the cookie with specified name. * This call checks expiration dates and does not return expired cookies. * @param {String} name cookie name * @return {String} cookie value or null */ get: function(name) { var cookie = this.cookies[name] if (cookie && this.checkNotExpired(name)) { return this.cookies[name].value } return null }, /** * Sets cookie's value and optional options * @param {String} name cookie's name * @param {String} value value * @param {Object} options with the following fields: * - {Boolean} secure - is cookie secure or not (does not mean anything for now) * - {Date} expires - cookie's expiration date. If specified then cookie will disappear after that date */ set: function(name, value, options) { var cookie = typeof options == 'object' ? {value: value, expires: options.expires, secure: options.secure || false, new: options.new || false} : {value: value} if (this.checkNotExpired(name, cookie)) { this.cookies[name] = cookie } }, // For testing purposes getExpirationDate: function(name) { return this.cookies[name] ? this.cookies[name].expires : null }, // Internal function checkNotExpired: function(name, cookie) { if (typeof cookie === 'undefined') { cookie = this.cookies[name] } var now = new Date() if (cookie && cookie.expires && now > cookie.expires) { delete this.cookies[name] return false } return true }, /** * Parses headers from server's response for 'set-cookie' header and store cookie's values. * Also parses expiration date * @param headers */ parseResponse: function(headers) { var cookies = headers['set-cookie'] if (cookies) { cookies.forEach(function(c) { var cookiesParams = c.split(';') var cookiePair = cookiesParams.shift().split('=') var options = {} cookiesParams.forEach(function(param) { param = param.trim() if (param.toLowerCase().indexOf('expires') == 0) { var date = param.split('=')[1].trim() options.expires = new Date(date) } }) this.set(cookiePair[0].trim(), cookiePair[1].trim(), options) }.bind(this)) } }, /** * Adds cookies to the provided headers as array. Does nothing if there are no cookies stored. * This call checks expiration dates and does not add expired cookies. * @param headers */ composeRequest: function(headers) { if (Object.keys(this.cookies).length == 0) { return } headers['Cookie'] = this.toString() }, /** * * @return {String} cookies as 'name=value' pairs joined by semicolon */ toString: function() { return Object.keys(this.cookies) .filter(this.checkNotExpired.bind(this)) .map(function(name) { return name + '=' + this.cookies[name].value }.bind(this)).join(';') } } module.exports = Cookies