socketioMEANseed/server/node_modules/vary/index.js
server/node_modules/vary/index.jsRaw
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
13module.exports = vary;
14module.exports.append = append;
15
16/**
17 * Variables.
18 */
19
20var 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
31function 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
89function 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
101function 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}