diff --git a/README.md b/README.md index c8b485a..5dfb81b 100755 --- a/README.md +++ b/README.md @@ -410,7 +410,14 @@ These are the available config options for making requests. Only the `url` is re // `cancelToken` specifies a cancel token that can be used to cancel the request // (see Cancellation section below for details) cancelToken: new CancelToken(function (cancel) { - }) + }), + + // `decompress` indicates whether or not the response body should be decompressed + // automatically. If set to `true` will also remove the 'content-encoding' header + // from the responses objects of all decompressed responses + // - Node only (XHR cannot turn off decompression) + decompress: true // default + } ``` diff --git a/index.d.ts b/index.d.ts index b427e18..7244683 100644 --- a/index.d.ts +++ b/index.d.ts @@ -69,6 +69,7 @@ export interface AxiosRequestConfig { httpsAgent?: any; proxy?: AxiosProxyConfig | false; cancelToken?: CancelToken; + decompress?: boolean; } export interface AxiosResponse { diff --git a/lib/adapters/http.js b/lib/adapters/http.js index e0c57b2..32ef61b 100755 --- a/lib/adapters/http.js +++ b/lib/adapters/http.js @@ -181,20 +181,25 @@ module.exports = function httpAdapter(config) { // uncompress the response body transparently if required var stream = res; + // return the last request in case of redirects var lastRequest = res.req || req; - switch (res.headers['content-encoding']) { - /*eslint default-case:0*/ - case 'gzip': - case 'compress': - case 'deflate': - // add the unzipper to the body stream processing pipeline - stream = (res.statusCode === 204 || lastRequest.method === 'HEAD') ? stream : stream.pipe(zlib.createUnzip()); - // remove the content-encoding in order to not confuse downstream operations - delete res.headers['content-encoding']; - break; + // if no content, is HEAD request or decompress disabled we should not decompress + if (res.statusCode !== 204 && lastRequest.method !== 'HEAD' && config.decompress !== false) { + switch (res.headers['content-encoding']) { + /*eslint default-case:0*/ + case 'gzip': + case 'compress': + case 'deflate': + // add the unzipper to the body stream processing pipeline + stream = stream.pipe(zlib.createUnzip()); + + // remove the content-encoding in order to not confuse downstream operations + delete res.headers['content-encoding']; + break; + } } var response = { diff --git a/test/unit/adapters/http.js b/test/unit/adapters/http.js index 79db615..a5c6c74 100644 --- a/test/unit/adapters/http.js +++ b/test/unit/adapters/http.js @@ -192,6 +192,27 @@ describe('supports http with nodejs', function () { }); }); + it('should support disabling automatic decompression of response data', function(done) { + var data = 'Test data'; + + zlib.gzip(data, function(err, zipped) { + server = http.createServer(function(req, res) { + res.setHeader('Content-Type', 'text/html;charset=utf-8'); + res.setHeader('Content-Encoding', 'gzip'); + res.end(zipped); + }).listen(4444, function() { + axios.get('http://localhost:4444/', { + decompress: false, + responseType: 'arraybuffer' + + }).then(function(res) { + assert.equal(res.data.toString('base64'), zipped.toString('base64')); + done(); + }); + }); + }); + }); + it('should support UTF8', function (done) { var str = Array(100000).join('ж'); @@ -731,4 +752,3 @@ describe('supports http with nodejs', function () { }); }); -