@@ -38,7 +38,7 @@ module.exports.filter = shouldCompress
3838var cacheControlNoTransformRegExp = / (?: ^ | , ) \s * ?n o - t r a n s f o r m \s * ?(?: , | $ ) /
3939
4040/**
41- * Compress response data with gzip / deflate.
41+ * Compress response data with gzip / deflate / brotli .
4242 *
4343 * @param {Object } [options]
4444 * @return {Function } middleware
@@ -175,11 +175,20 @@ function compression (options) {
175175
176176 // compression method
177177 var accept = accepts ( req )
178- var method = accept . encoding ( [ 'gzip' , 'deflate' , 'identity' ] )
178+ var methods = [ 'gzip' , 'deflate' , 'identity' ]
179+ var preferredMethods = [ 'gzip' ]
180+
181+ if ( zlib . createBrotliDecompress ) {
182+ methods . unshift ( 'br' )
183+ preferredMethods . unshift ( 'br' )
184+ }
185+
186+ var method = accept . encoding ( methods )
179187
180188 // we really don't prefer deflate
181- if ( method === 'deflate' && accept . encoding ( [ 'gzip' ] ) ) {
182- method = accept . encoding ( [ 'gzip' , 'identity' ] )
189+ if ( method === 'deflate' && accept . encoding ( preferredMethods ) ) {
190+ preferredMethods . push ( 'identity' )
191+ method = accept . encoding ( preferredMethods )
183192 }
184193
185194 // negotiation failed
@@ -190,9 +199,11 @@ function compression (options) {
190199
191200 // compression stream
192201 debug ( '%s compression' , method )
193- stream = method === 'gzip'
194- ? zlib . createGzip ( opts )
195- : zlib . createDeflate ( opts )
202+ switch ( method ) {
203+ case 'br' : stream = zlib . createBrotliDecompress ( opts ) ; break
204+ case 'gzip' : stream = zlib . createGzip ( opts ) ; break
205+ case 'deflate' : stream = zlib . createDeflate ( opts ) ; break
206+ }
196207
197208 // add buffered listeners to stream
198209 addListeners ( stream , stream . on , listeners )
0 commit comments