1 module.exports = preferredEncodings;
2 preferredEncodings.preferredEncodings = preferredEncodings;
4 function parseAcceptEncoding(accept) {
5 var accepts = accept.split(',');
6 var hasIdentity = false;
9 for (var i = 0, j = 0; i < accepts.length; i++) {
10 var encoding = parseEncoding(accepts[i].trim(), i);
13 accepts[j++] = encoding;
14 hasIdentity = hasIdentity || specify('identity', encoding);
15 minQuality = Math.min(minQuality, encoding.q || 1);
21 * If identity doesn't explicitly appear in the accept-encoding header,
22 * it's added to the list of acceptable encoding with the lowest q
37 function parseEncoding(s, i) {
38 var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/);
40 if (!match) return null;
42 var encoding = match[1];
45 var params = match[2].split(';');
46 for (var i = 0; i < params.length; i ++) {
47 var p = params[i].trim().split('=');
62 function getEncodingPriority(encoding, accepted, index) {
63 var priority = {o: -1, q: 0, s: 0};
65 for (var i = 0; i < accepted.length; i++) {
66 var spec = specify(encoding, accepted[i], index);
68 if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
76 function specify(encoding, spec, index) {
78 if(spec.encoding.toLowerCase() === encoding.toLowerCase()){
80 } else if (spec.encoding !== '*' ) {
92 function preferredEncodings(accept, provided) {
93 var accepts = parseAcceptEncoding(accept || '');
96 // sorted list of all encodings
97 return accepts.filter(isQuality).sort(compareSpecs).map(function getEncoding(spec) {
102 var priorities = provided.map(function getPriority(type, index) {
103 return getEncodingPriority(type, accepts, index);
106 // sorted list of accepted encodings
107 return priorities.filter(isQuality).sort(compareSpecs).map(function getEncoding(priority) {
108 return provided[priorities.indexOf(priority)];
112 function compareSpecs(a, b) {
113 return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
116 function isQuality(spec) {