| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- module.exports = preferredEncodings;
- preferredEncodings.preferredEncodings = preferredEncodings;
- function parseAcceptEncoding(accept) {
- var acceptableEncodings;
- if (accept) {
- acceptableEncodings = accept.split(',').map(function(e) {
- return parseEncoding(e.trim());
- });
- } else {
- acceptableEncodings = [];
- }
- if (!acceptableEncodings.some(function(e) {
- return e && e.encoding === 'identity';
- })) {
- acceptableEncodings.push({
- encoding: 'identity',
- q: 0.1
- });
- }
- return acceptableEncodings.filter(function(e) {
- return e && e.q > 0;
- });
- }
- function parseEncoding(s) {
- var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/);
- if (!match) return null;
- var encoding = match[1];
- var q = 1;
- if (match[2]) {
- var params = match[2].split(';');
- for (var i = 0; i < params.length; i ++) {
- var p = params[i].trim().split('=');
- if (p[0] === 'q') {
- q = parseFloat(p[1]);
- break;
- }
- }
- }
- return {
- encoding: encoding,
- q: q
- };
- }
- function getEncodingPriority(encoding, accepted) {
- return (accepted.filter(function(a) {
- return specify(encoding, a);
- }).sort(function (a, b) {
- // revsort
- return a.q === b.q ? 0 : a.q > b.q ? -1 : 1;
- })[0] || {q:0}).q;
- }
- function specify(encoding, spec) {
- if (spec.encoding === '*' || spec.encoding === encoding) {
- return spec;
- }
- }
- function preferredEncodings(accept, provided) {
- accept = parseAcceptEncoding(accept || '');
- if (provided) {
- return provided.map(function(type) {
- return [type, getEncodingPriority(type, accept)];
- }).filter(function(pair) {
- return pair[1] > 0;
- }).sort(function(a, b) {
- // revsort
- return a[1] === b[1] ? 0 : a[1] > b[1] ? -1 : 1;
- }).map(function(pair) {
- return pair[0];
- });
- } else {
- return accept.sort(function (a, b) {
- // revsort
- return a.q < b.q ? 1 : -1;
- }).map(function(type) {
- return type.encoding;
- });
- }
- }
|