From 42eb9dfabc85ed029462da1c503f8b414b08ffd0 Mon Sep 17 00:00:00 2001 From: Spencer von der Ohe Date: Fri, 6 Mar 2020 07:01:58 -0700 Subject: [PATCH] Adding option to disable automatic decompression (#2661) * Adding ability to disable auto decompression * Updating decompress documentation in README * Fixing test\unit\adapters\http.js lint errors * Adding test for disabling auto decompression * Removing changes that fixed lint errors in tests * Removing formating change to unit test Co-authored-by: Xianming Zhong --- README.md | 9 ++++++++- index.d.ts | 1 + lib/adapters/http.js | 25 +++++++++++++++---------- test/unit/adapters/http.js | 22 +++++++++++++++++++++- 4 files changed, 45 insertions(+), 12 deletions(-) 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 () { }); }); -