1e544e819d0dc112284fd46138a2f88015600ee2
[sdnc/oam.git] / dgbuilder / dgeflows / node_modules / express / node_modules / vary / index.js
1 /*!
2  * vary
3  * Copyright(c) 2014 Douglas Christopher Wilson
4  * MIT Licensed
5  */
6
7 /**
8  * Module exports.
9  */
10
11 module.exports = vary;
12 module.exports.append = append;
13
14 /**
15  * Variables.
16  */
17
18 var separators = /[\(\)<>@,;:\\"\/\[\]\?=\{\}\u0020\u0009]/;
19
20 /**
21  * Append a field to a vary header.
22  *
23  * @param {String} header
24  * @param {String|Array} field
25  * @return {String}
26  * @api public
27  */
28
29 function append(header, field) {
30   if (typeof header !== 'string') {
31     throw new TypeError('header argument is required');
32   }
33
34   if (!field) {
35     throw new TypeError('field argument is required');
36   }
37
38   // get fields array
39   var fields = !Array.isArray(field)
40     ? parse(String(field))
41     : field;
42
43   // assert on invalid fields
44   for (var i = 0; i < fields.length; i++) {
45     if (separators.test(fields[i])) {
46       throw new TypeError('field argument contains an invalid header');
47     }
48   }
49
50   // existing, unspecified vary
51   if (header === '*') {
52     return header;
53   }
54
55   // enumerate current values
56   var vals = parse(header.toLowerCase());
57
58   // unspecified vary
59   if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) {
60     return '*';
61   }
62
63   for (var i = 0; i < fields.length; i++) {
64     field = fields[i].toLowerCase();
65
66     // append value (case-preserving)
67     if (vals.indexOf(field) === -1) {
68       vals.push(field);
69       header = header
70         ? header + ', ' + fields[i]
71         : fields[i];
72     }
73   }
74
75   return header;
76 }
77
78 /**
79  * Parse a vary header into an array.
80  *
81  * @param {String} header
82  * @return {Array}
83  * @api private
84  */
85
86 function parse(header) {
87   return header.trim().split(/ *, */);
88 }
89
90 /**
91  * Mark that a request is varied on a header field.
92  *
93  * @param {Object} res
94  * @param {String|Array} field
95  * @api public
96  */
97
98 function vary(res, field) {
99   if (!res || !res.getHeader || !res.setHeader) {
100     // quack quack
101     throw new TypeError('res argument is required');
102   }
103
104   // get existing header
105   var val = res.getHeader('Vary') || ''
106   var header = Array.isArray(val)
107     ? val.join(', ')
108     : String(val);
109
110   // set new header
111   res.setHeader('Vary', append(header, field));
112 }