@@ -96,7 +96,7 @@ function parseEncoding(str, i) {
9696 */
9797
9898function getEncodingPriority ( encoding , accepted , index ) {
99- var priority = { o : - 1 , q : 0 , s : 0 } ;
99+ var priority = { encoding : encoding , o : - 1 , q : 0 , s : 0 } ;
100100
101101 for ( var i = 0 ; i < accepted . length ; i ++ ) {
102102 var spec = specify ( encoding , accepted [ i ] , index ) ;
@@ -123,6 +123,7 @@ function specify(encoding, spec, index) {
123123 }
124124
125125 return {
126+ encoding : encoding ,
126127 i : index ,
127128 o : spec . i ,
128129 q : spec . q ,
@@ -135,14 +136,34 @@ function specify(encoding, spec, index) {
135136 * @public
136137 */
137138
138- function preferredEncodings ( accept , provided ) {
139+ function preferredEncodings ( accept , provided , preferred ) {
139140 var accepts = parseAcceptEncoding ( accept || '' ) ;
140141
142+ var comparator = preferred ? function comparator ( a , b ) {
143+ if ( a . q !== b . q ) {
144+ return b . q - a . q // higher quality first
145+ }
146+
147+ var aPreferred = preferred . indexOf ( a . encoding )
148+ var bPreferred = preferred . indexOf ( b . encoding )
149+
150+ if ( aPreferred === - 1 && bPreferred === - 1 ) {
151+ // consider the original specifity/order
152+ return ( b . s - a . s ) || ( a . o - b . o ) || ( a . i - b . i )
153+ }
154+
155+ if ( aPreferred !== - 1 && bPreferred !== - 1 ) {
156+ return aPreferred - bPreferred // consider the preferred order
157+ }
158+
159+ return aPreferred === - 1 ? 1 : - 1 // preferred first
160+ } : compareSpecs ;
161+
141162 if ( ! provided ) {
142163 // sorted list of all encodings
143164 return accepts
144165 . filter ( isQuality )
145- . sort ( compareSpecs )
166+ . sort ( comparator )
146167 . map ( getFullEncoding ) ;
147168 }
148169
@@ -151,7 +172,7 @@ function preferredEncodings(accept, provided) {
151172 } ) ;
152173
153174 // sorted list of accepted encodings
154- return priorities . filter ( isQuality ) . sort ( compareSpecs ) . map ( function getEncoding ( priority ) {
175+ return priorities . filter ( isQuality ) . sort ( comparator ) . map ( function getEncoding ( priority ) {
155176 return provided [ priorities . indexOf ( priority ) ] ;
156177 } ) ;
157178}
@@ -162,7 +183,7 @@ function preferredEncodings(accept, provided) {
162183 */
163184
164185function compareSpecs ( a , b ) {
165- return ( b . q - a . q ) || ( b . s - a . s ) || ( a . o - b . o ) || ( a . i - b . i ) || 0 ;
186+ return ( b . q - a . q ) || ( b . s - a . s ) || ( a . o - b . o ) || ( a . i - b . i ) ;
166187}
167188
168189/**
0 commit comments