/** * headers.js * * Headers class offers convenient helpers */ module.exports = Headers; /** * Headers class * * @param Object headers Response headers * @return Void */ function Headers(headers) { var self = this; this._headers = {}; // Headers if (headers instanceof Headers) { headers = headers.raw(); } // plain object for (var prop in headers) { if (!headers.hasOwnProperty(prop)) { continue; } if (typeof headers[prop] === 'string') { this.set(prop, headers[prop]); } else if (typeof headers[prop] === 'number' && !isNaN(headers[prop])) { this.set(prop, headers[prop].toString()); } else if (Array.isArray(headers[prop])) { headers[prop].forEach(function(item) { self.append(prop, item.toString()); }); } } } /** * Return first header value given name * * @param String name Header name * @return Mixed */ Headers.prototype.get = function(name) { var list = this._headers[name.toLowerCase()]; return list ? list[0] : null; }; /** * Return all header values given name * * @param String name Header name * @return Array */ Headers.prototype.getAll = function(name) { if (!this.has(name)) { return []; } return this._headers[name.toLowerCase()]; }; /** * Iterate over all headers * * @param Function callback Executed for each item with parameters (value, name, thisArg) * @param Boolean thisArg `this` context for callback function * @return Void */ Headers.prototype.forEach = function(callback, thisArg) { Object.getOwnPropertyNames(this._headers).forEach(function(name) { this._headers[name].forEach(function(value) { callback.call(thisArg, value, name, this) }, this) }, this) } /** * Overwrite header values given name * * @param String name Header name * @param String value Header value * @return Void */ Headers.prototype.set = function(name, value) { this._headers[name.toLowerCase()] = [value]; }; /** * Append a value onto existing header * * @param String name Header name * @param String value Header value * @return Void */ Headers.prototype.append = function(name, value) { if (!this.has(name)) { this.set(name, value); return; } this._headers[name.toLowerCase()].push(value); }; /** * Check for header name existence * * @param String name Header name * @return Boolean */ Headers.prototype.has = function(name) { return this._headers.hasOwnProperty(name.toLowerCase()); }; /** * Delete all header values given name * * @param String name Header name * @return Void */ Headers.prototype['delete'] = function(name) { delete this._headers[name.toLowerCase()]; }; /** * Return raw headers (non-spec api) * * @return Object */ Headers.prototype.raw = function() { return this._headers; };