Skip to content

Commit

Permalink
fix: support deflate raw responses
Browse files Browse the repository at this point in the history
  • Loading branch information
Uzlopak committed Jan 27, 2024
1 parent ba70685 commit 91b9b57
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
36 changes: 32 additions & 4 deletions lib/fetch/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ const {
} = require('./constants')
const { kHeadersList, kConstruct } = require('../core/symbols')
const EE = require('events')
const { Readable, pipeline } = require('stream')
const { Readable, pipeline, Transform } = require('stream')
const { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor, bufferToLowerCasedHeaderName } = require('../core/util')
const { dataURLProcessor, serializeAMimeType, parseMIMEType } = require('./dataURL')
const { getGlobalDispatcher } = require('../global')
Expand Down Expand Up @@ -1096,7 +1096,7 @@ function fetchFinale (fetchParams, response) {
// 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm and flushAlgorithm
// set to processResponseEndOfBody.
const transformStream = new TransformStream({
start () {},
start () { },
transform (chunk, controller) {
controller.enqueue(chunk)
},
Expand Down Expand Up @@ -2186,7 +2186,35 @@ async function httpNetworkFetch (
finishFlush: zlib.constants.Z_SYNC_FLUSH
}))
} else if (coding === 'deflate') {
decoders.push(zlib.createInflate())
// Instantiate a Stream, which pipes the response to zlib.createInflate()
// or zlib.createInflateRaw() depending on the first byte of the Buffer.
// If the lower byte of the first byte is 0x08, then the stream is
// interpreted as a zlib stream, otherwise it's interpreted as a
// raw deflate stream.
const deflateDecoder = new Transform({
transform (chunk, encoding, callback) {
if (!this._inflateStream) {
this._inflateStream = (chunk[0] & 0x0F) === 0x08
? zlib.createInflate()
: zlib.createInflateRaw()

this._inflateStream.on('data', this.push.bind(this))
this._inflateStream.on('end', callback)
this._inflateStream.on('error', callback)
}

this._inflateStream.write(chunk, encoding, callback)
},
final (callback) {
if (this._inflateStream) {
this._inflateStream.end()
this._inflateStream = null
}
callback()
}
})

decoders.push(deflateDecoder)
} else if (coding === 'br') {
decoders.push(zlib.createBrotliDecompress())
} else {
Expand All @@ -2202,7 +2230,7 @@ async function httpNetworkFetch (
headersList,
body: decoders.length
? pipeline(this.body, ...decoders, () => { })
: this.body.on('error', () => {})
: this.body.on('error', () => { })
})

return true
Expand Down
2 changes: 1 addition & 1 deletion test/node-fetch/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -659,7 +659,7 @@ describe('node-fetch', () => {
})
})

xit('should decompress deflate raw response from old apache server', () => {
it('should decompress deflate raw response from old apache server', () => {
const url = `${base}deflate-raw`
return fetch(url).then(res => {
expect(res.headers.get('content-type')).to.equal('text/plain')
Expand Down

0 comments on commit 91b9b57

Please sign in to comment.