arnaucube
arnaucube/socketioMEANseedPublic Self-hosted repository
socketioMEANseed/server/node_modules/negotiator/lib/charset.js
server/node_modules/negotiator/lib/charset.jsRaw
 1module.exports = preferredCharsets;
 2preferredCharsets.preferredCharsets = preferredCharsets;
 3
 4function parseAcceptCharset(accept) {
 5  return accept.split(',').map(function(e, i) {
 6    return parseCharset(e.trim(), i);
 7  }).filter(function(e) {
 8    return e;
 9  });
10}
11
12function parseCharset(s, i) {
13  var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/);
14  if (!match) return null;
15
16  var charset = match[1];
17  var q = 1;
18  if (match[2]) {
19    var params = match[2].split(';')
20    for (var i = 0; i < params.length; i ++) {
21      var p = params[i].trim().split('=');
22      if (p[0] === 'q') {
23        q = parseFloat(p[1]);
24        break;
25      }
26    }
27  }
28
29  return {
30    charset: charset,
31    q: q,
32    i: i
33  };
34}
35
36function getCharsetPriority(charset, accepted) {
37  return (accepted.map(function(a) {
38    return specify(charset, a);
39  }).filter(Boolean).sort(function (a, b) {
40    if(a.s == b.s) {
41      return a.q > b.q ? -1 : 1;
42    } else {
43      return a.s > b.s ? -1 : 1;
44    }
45  })[0] || {s: 0, q:0});
46}
47
48function specify(charset, spec) {
49  var s = 0;
50  if(spec.charset.toLowerCase() === charset.toLowerCase()){
51    s |= 1;
52  } else if (spec.charset !== '*' ) {
53    return null
54  }
55
56  return {
57    s: s,
58    q: spec.q,
59  }
60}
61
62function preferredCharsets(accept, provided) {
63  // RFC 2616 sec 14.2: no header = *
64  accept = parseAcceptCharset(accept === undefined ? '*' : accept || '');
65  if (provided) {
66    return provided.map(function(type) {
67      return [type, getCharsetPriority(type, accept)];
68    }).filter(function(pair) {
69      return pair[1].q > 0;
70    }).sort(function(a, b) {
71      var pa = a[1];
72      var pb = b[1];
73      return (pb.q - pa.q) || (pb.s - pa.s) || (pa.i - pb.i);
74    }).map(function(pair) {
75      return pair[0];
76    });
77  } else {
78    return accept.sort(function (a, b) {
79      // revsort
80      return (b.q - a.q) || (a.i - b.i);
81    }).filter(function(type) {
82      return type.q > 0;
83    }).map(function(type) {
84      return type.charset;
85    });
86  }
87}