mswjs / msw

Seamless REST/GraphQL API mocking library for browser and Node.js.
https://mswjs.io
MIT License
15.28k stars 479 forks source link

Axios fails to follow redirects from MSW mocked responses #2177

Open a11rew opened 3 weeks ago

a11rew commented 3 weeks ago

Prerequisites

Environment check

Node.js version

v20.12.2

Other versions

msw - 2.3.1 axios - 1.7.2

Reproduction repository

https://codesandbox.io/p/devbox/axios-follow-redirects-issue-9qn7z9

Reproduction steps

  1. Setup a http.get response handler that responds with a redirect (HttpResponse.redirect or new Response with 3xx code and Location header)
  2. Make a GET request to the URL specified in the handler

Current behavior

The request fails with this error message originating from the follow-redirects library Axios uses

Error [ERR_FR_REDIRECTION_FAILURE]: Redirected request failed: Cannot read properties of undefined (reading 'getHeader')

The stack trace points to this line in the follow-redirects lib https://github.com/follow-redirects/follow-redirects/blob/35a517c5861d79dc8bff7db8626013d20b711b06/index.js#L422

response.req.getHeader is undefined in the IncomingMessage/response follow-redirects receives when the response is mocked using MSW. This does not happen when the requests returning redirects are not intercepted with MSW.

Expected behavior

Axios should be able to follow redirects normally like it does when responses are not mocked with MSW.

kettanaito commented 2 weeks ago

Hi, @a11rew. Thanks for reporting this.

We have a test for follow-redirects here but, apparently, it misses something. One difference I can spot is that in our tests the original server responds with a redirect, while in your use case the mock does that. Perhaps that's the culprit.

Would you have some time to add a new test case to the test I've linked above? Something like

interceptor.on('request', ({ request }) => {
  request.respondWith(new Response(null, {
    status: 300,
    headers: { Location: '/new/url' }
  }))
})
a11rew commented 2 weeks ago

Added the failing test case in this PR https://github.com/mswjs/interceptors/pull/581 @kettanaito. I'd be open to contributing a fix for this, any pointers on where I should be looking?