142 lines
2.7 KiB
JavaScript
142 lines
2.7 KiB
JavaScript
|
|
||
|
/**
|
||
|
* 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;
|
||
|
};
|