|
'use strict'; |
|
const {PassThrough: PassThroughStream} = require('stream'); |
|
const zlib = require('zlib'); |
|
const mimicResponse = require('mimic-response'); |
|
|
|
const decompressResponse = response => { |
|
const contentEncoding = (response.headers['content-encoding'] || '').toLowerCase(); |
|
|
|
if (!['gzip', 'deflate', 'br'].includes(contentEncoding)) { |
|
return response; |
|
} |
|
|
|
const isBrotli = contentEncoding === 'br'; |
|
if (isBrotli && typeof zlib.createBrotliDecompress !== 'function') { |
|
return response; |
|
} |
|
|
|
const decompress = isBrotli ? zlib.createBrotliDecompress() : zlib.createUnzip(); |
|
const stream = new PassThroughStream(); |
|
|
|
mimicResponse(response, stream); |
|
|
|
decompress.on('error', error => { |
|
|
|
if (error.code === 'Z_BUF_ERROR') { |
|
stream.end(); |
|
return; |
|
} |
|
|
|
stream.emit('error', error); |
|
}); |
|
|
|
response.pipe(decompress).pipe(stream); |
|
|
|
return stream; |
|
}; |
|
|
|
module.exports = decompressResponse; |
|
|
|
module.exports.default = decompressResponse; |
|
|