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