Skip to content

Commit

Permalink
Adding option to disable automatic decompression (#2661)
Browse files Browse the repository at this point in the history
* 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 <chinesedfan@qq.com>
  • Loading branch information
sazzy4o and chinesedfan committed Mar 6, 2020
1 parent 6642ca9 commit 42eb9df
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 11 deletions.
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

}
```

Expand Down
1 change: 1 addition & 0 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ export interface AxiosRequestConfig {
httpsAgent?: any;
proxy?: AxiosProxyConfig | false;
cancelToken?: CancelToken;
decompress?: boolean;
}

export interface AxiosResponse<T = any> {
Expand Down
23 changes: 14 additions & 9 deletions lib/adapters/http.js
Original file line number Diff line number Diff line change
Expand Up @@ -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':

// 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 = (res.statusCode === 204 || lastRequest.method === 'HEAD') ? stream : stream.pipe(zlib.createUnzip());
stream = stream.pipe(zlib.createUnzip());

// remove the content-encoding in order to not confuse downstream operations
delete res.headers['content-encoding'];
break;
// remove the content-encoding in order to not confuse downstream operations
delete res.headers['content-encoding'];
break;
}
}

var response = {
Expand Down
22 changes: 21 additions & 1 deletion test/unit/adapters/http.js
Original file line number Diff line number Diff line change
Expand Up @@ -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('ж');

Expand Down Expand Up @@ -731,4 +752,3 @@ describe('supports http with nodejs', function () {
});
});


0 comments on commit 42eb9df

Please sign in to comment.