2
0
mirror of https://github.com/tenrok/axios.git synced 2026-05-15 11:59:42 +03:00

fix(http): add zlib headers if missing (#5497)

This commit is contained in:
ItsNotGoodName
2023-01-30 14:49:37 -08:00
committed by GitHub
parent 9915635c69
commit 65e8d1e28c
3 changed files with 43 additions and 2 deletions
+9
View File
@@ -19,6 +19,7 @@ import stream from 'stream';
import AxiosHeaders from '../core/AxiosHeaders.js';
import AxiosTransformStream from '../helpers/AxiosTransformStream.js';
import EventEmitter from 'events';
import ZlibHeaderTransformStream from '../helpers/ZlibHeaderTransformStream.js';
const zlibOptions = {
flush: zlib.constants.Z_SYNC_FLUSH,
@@ -425,7 +426,15 @@ export default isHttpAdapterSupported && function httpAdapter(config) {
case 'x-gzip':
case 'compress':
case 'x-compress':
// add the unzipper to the body stream processing pipeline
streams.push(zlib.createUnzip(zlibOptions));
// remove the content-encoding in order to not confuse downstream operations
delete res.headers['content-encoding'];
break;
case 'deflate':
streams.push(new ZlibHeaderTransformStream());
// add the unzipper to the body stream processing pipeline
streams.push(zlib.createUnzip(zlibOptions));
+28
View File
@@ -0,0 +1,28 @@
"use strict";
import stream from "stream";
class ZlibHeaderTransformStream extends stream.Transform {
__transform(chunk, encoding, callback) {
this.push(chunk);
callback();
}
_transform(chunk, encoding, callback) {
if (chunk.length !== 0) {
this._transform = this.__transform;
// Add Default Compression headers if no zlib headers are present
if (chunk[0] !== 120) { // Hex: 78
const header = Buffer.alloc(2);
header[0] = 120; // Hex: 78
header[1] = 156; // Hex: 9C
this.push(header, encoding);
}
}
this.__transform(chunk, encoding, callback);
}
}
export default ZlibHeaderTransformStream;
+6 -2
View File
@@ -35,6 +35,7 @@ const pipelineAsync = util.promisify(stream.pipeline);
const finishedAsync = util.promisify(stream.finished);
const gzip = util.promisify(zlib.gzip);
const deflate = util.promisify(zlib.deflate);
const deflateRaw = util.promisify(zlib.deflateRaw);
const brotliCompress = util.promisify(zlib.brotliCompress);
function toleranceRange(positive, negative) {
@@ -493,13 +494,16 @@ describe('supports http with nodejs', function () {
describe('algorithms', ()=> {
const responseBody ='str';
for (const [type, zipped] of Object.entries({
for (const [typeName, zipped] of Object.entries({
gzip: gzip(responseBody),
compress: gzip(responseBody),
deflate: deflate(responseBody),
'deflate-raw': deflateRaw(responseBody),
br: brotliCompress(responseBody)
})) {
describe(`${type} decompression`, async () => {
const type = typeName.split('-')[0];
describe(`${typeName} decompression`, async () => {
it(`should support decompression`, async () => {
server = await startHTTPServer(async (req, res) => {
res.setHeader('Content-Encoding', type);