UNPKG

2.81 kBJavaScriptView Raw
1
2/**
3 * headers.js
4 *
5 * Headers class offers convenient helpers
6 */
7
8module.exports = Headers;
9
10/**
11 * Headers class
12 *
13 * @param Object headers Response headers
14 * @return Void
15 */
16function Headers(headers) {
17
18 var self = this;
19 this._headers = {};
20
21 // Headers
22 if (headers instanceof Headers) {
23 headers = headers.raw();
24 }
25
26 // plain object
27 for (var prop in headers) {
28 if (!headers.hasOwnProperty(prop)) {
29 continue;
30 }
31
32 if (typeof headers[prop] === 'string') {
33 this.set(prop, headers[prop]);
34
35 } else if (typeof headers[prop] === 'number' && !isNaN(headers[prop])) {
36 this.set(prop, headers[prop].toString());
37
38 } else if (headers[prop] instanceof Array) {
39 headers[prop].forEach(function(item) {
40 self.append(prop, item.toString());
41 });
42 }
43 }
44
45}
46
47/**
48 * Return first header value given name
49 *
50 * @param String name Header name
51 * @return Mixed
52 */
53Headers.prototype.get = function(name) {
54 var list = this._headers[name.toLowerCase()];
55 return list ? list[0] : null;
56};
57
58/**
59 * Return all header values given name
60 *
61 * @param String name Header name
62 * @return Array
63 */
64Headers.prototype.getAll = function(name) {
65 if (!this.has(name)) {
66 return [];
67 }
68
69 return this._headers[name.toLowerCase()];
70};
71
72/**
73 * Iterate over all headers
74 *
75 * @param Function callback Executed for each item with parameters (value, name, thisArg)
76 * @param Boolean thisArg `this` context for callback function
77 * @return Void
78 */
79Headers.prototype.forEach = function(callback, thisArg) {
80 Object.getOwnPropertyNames(this._headers).forEach(function(name) {
81 this._headers[name].forEach(function(value) {
82 callback.call(thisArg, value, name, this)
83 }, this)
84 }, this)
85}
86
87/**
88 * Overwrite header values given name
89 *
90 * @param String name Header name
91 * @param String value Header value
92 * @return Void
93 */
94Headers.prototype.set = function(name, value) {
95 this._headers[name.toLowerCase()] = [value];
96};
97
98/**
99 * Append a value onto existing header
100 *
101 * @param String name Header name
102 * @param String value Header value
103 * @return Void
104 */
105Headers.prototype.append = function(name, value) {
106 if (!this.has(name)) {
107 this.set(name, value);
108 return;
109 }
110
111 this._headers[name.toLowerCase()].push(value);
112};
113
114/**
115 * Check for header name existence
116 *
117 * @param String name Header name
118 * @return Boolean
119 */
120Headers.prototype.has = function(name) {
121 return this._headers.hasOwnProperty(name.toLowerCase());
122};
123
124/**
125 * Delete all header values given name
126 *
127 * @param String name Header name
128 * @return Void
129 */
130Headers.prototype['delete'] = function(name) {
131 delete this._headers[name.toLowerCase()];
132};
133
134/**
135 * Return raw headers (non-spec api)
136 *
137 * @return Object
138 */
139Headers.prototype.raw = function() {
140 return this._headers;
141};