mswjs / interceptors

Low-level network interception library.
https://npm.im/@mswjs/interceptors
MIT License
537 stars 123 forks source link

GZIP doesn't work with got #446

Open mikicho opened 11 months ago

mikicho commented 11 months ago
const { ClientRequestInterceptor } = require('@mswjs/interceptors/ClientRequest')
const got = require('got')
const zlib = require('zlib')

const interceptor = new ClientRequestInterceptor({
  name: 'my-interceptor',
})
interceptor.apply();
interceptor.on('request', ({ request }) => {
  const compressed = zlib.gzipSync('hello')
  request.respondWith(new Response(compressed, {
    status: 200, headers: {
      'X-Transfer-Length': String(compressed.length),
      'Content-Length': undefined,
      'Content-Encoding': 'gzip',
    }
  }))
});

(async function () {
  console.log(1);
  console.log(await got('http://example.test/foo'))
  console.log(2);
})()

Specifically, got exits in this line with error code 0 (ok). I couldn't catch the error (even with a try-catch), so I'm unsure what's happening.

It does work with native http.

May be related to: #308

mikicho commented 11 months ago

I investigated it further. It seems like we don't emit a readable event. The for await (const chunk of stream) in got waits for a readable event, which is never emitted. I suspect it is connected to the response clones, or maybe the ReadableStream in the createResponse

kettanaito commented 1 month ago

This should be fixed by #604.