Skip to content

Commit

Permalink
fix(http): add zlib headers if missing (#5497)
Browse files Browse the repository at this point in the history
  • Loading branch information
ItsNotGoodName committed Jan 30, 2023
1 parent 9915635 commit 65e8d1e
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 2 deletions.
9 changes: 9 additions & 0 deletions lib/adapters/http.js
Expand Up @@ -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,
Expand Down Expand Up @@ -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));

Expand Down
28 changes: 28 additions & 0 deletions lib/helpers/ZlibHeaderTransformStream.js
@@ -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;
8 changes: 6 additions & 2 deletions test/unit/adapters/http.js
Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 65e8d1e

Please sign in to comment.