Skip to content

Using config.beforeRedirect prevents using proxy on redirected requests #4703

@mbargiel

Description

@mbargiel

Describe the bug

The support for config.beforeRedirect introduced a regression of #3369 when both config.beforeRedirect and a proxy are used. Both of them internally set options.beforeRedirect. Moreover, config.beforeRedirect is not re-applied on subsequent redirections.

To Reproduce

Adding the following test in test/unit/adapters/http.js

  it('should support beforeRedirect and proxy with redirect', function (done) {
    var requestCount = 0;
    var totalRedirectCount = 5;
    server = http.createServer(function (req, res) {
      requestCount += 1;
      if (requestCount <= totalRedirectCount) {
        res.setHeader('Location', 'http://localhost:4444');
        res.writeHead(302);
      }
      res.end();
    }).listen(4444, function () {
      var proxyUseCount = 0;
      proxy = http.createServer(function (request, response) {
        proxyUseCount += 1;
        var parsed = url.parse(request.url);
        var opts = {
          host: parsed.hostname,
          port: parsed.port,
          path: parsed.path
        };

        http.get(opts, function (res) {
          response.writeHead(res.statusCode, res.headers);
          res.on('data', function (data) {
            response.write(data)
          });
          res.on('end', function () {
            response.end();
          });
        });
      }).listen(4000, function () {
        var configBeforeRedirectCount = 0;
        axios.get('http://localhost:4444/', {
          proxy: {
            host: 'localhost',
            port: 4000
          },
          maxRedirects: totalRedirectCount,
          beforeRedirect: function (options) {
            configBeforeRedirectCount += 1;
          }
        }).then(function (res) {
          assert.equal(totalRedirectCount, configBeforeRedirectCount, 'should invoke config.beforeRedirect option on every redirect');
          assert.equal(totalRedirectCount + 1, proxyUseCount, 'should go through proxy on every redirect');
          done();
        }).catch(done);
      });
    });
  });

Expected behavior

The test should pass, but currently 'should go through proxy on every redirect' assertion fails.

Environment

  • Axios Version 0.27.2
  • Adapter HTTP
  • Browser N/A
  • Browser Version N/A
  • Node.js Version N/A
  • OS: N/A
  • Additional Library Versions N/A

Additional context/Screenshots

I'm working on a small PR to fix this issue.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions