arnaucube
arnaucube/socketioMEANseedPublic Self-hosted repository
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}