axios / axios

Promise based HTTP client for the browser and node.js

Home Page:https://axios-http.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Axios proxy is not working.

pumanitro opened this issue · comments

Describe the bug
I have installed anyProxy 3rd party proxy ( http://anyproxy.io/en/#install )
When I type anyproxy in my command line then my proxy starts on http://localhost:8001
and I have also preview of proxy status on http://localhost:8002.

On the Frontend site, I'm using axios like:

axios
      .get("https://randomuser.me/api/?results=50", {
        proxy: {
          host: "http://localhost",
          port: 8001
        }
      })
      .then(response => {
        const data = response.data.results;
        this.setState({ data });
      })
      .catch(error => {
        console.log(error);
      });

Here is a simplified version of this:
https://codesandbox.io/s/j35zl05lk5

But the request is omitting proxy and is sent directly:
image

It behaves like the axios proxying functionality would not be even working.

I also tried stuff like:

let httpsProxyAgent = require("https-proxy-agent");
var agent = new httpsProxyAgent("http://localhost:8001");
...
 axios
      .get("https://randomuser.me/api/?results=50", {
        httpAgent: agent
      })
      .then(response => {
        const data = response.data.results;
        this.setState({ data });
      })
      .catch(error => {
        console.log(error);
      });

But it gives me the same result as the previous one.
Also tried npm dependency called "axios-https-proxy-fix", but with the same result.

Expected behavior
Proxying request to the proxy server.

Environment:

  • Axios Version "axios": "0.18.0",
  • OS: Win 10
  • Browser Chrime
  • Browser Version 73.0.3683.86

I can confirm. Full post on https://stackoverflow.com/questions/55981040/axios-https-request-over-a-proxy

I tried the proxy param, which is apparently not supported in browser, but at least I tried :

const axios = require('axios');

var res = await axios.get('https://api.ipify.org?format=json', {
    proxy: {
        host: 'proxy-url',
        port: 80,
        auth: {username: 'my-user', password: 'my-password'}
    }
});
console.log(res.data); // gives my ip and not the proxy's one

And also with the httpsAgent param :

const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent')

var agent = new HttpsProxyAgent('http://my-user:my-pass@proxy-url:port');
var res = await axios.get('https://api.ipify.org?format=json', {
    httpsAgent: agent,
});
console.log(res.data); // gives my ip and not the proxy's one

None of them work.

+1
proxy option not working with https
Any ideas how to solve this problem?

+1

+1 not working in version .19

commented

i did 3 things that got it working.

  1. updated node to v11+
  2. added --tls-min-v1.0 flag like this node --tls-min-v1.0 index.js
  3. updated axios to .19

first 2 didn't help without the last one.

i did 3 things that got it working.

  1. updated node to v11+
  2. added --tls-min-v1.0 flag like this node --tls-min-v1.0 index.js
  3. updated axios to .19

first 2 didn't help without the last one.

Thank you for that ! Next time i'll work on proxies i'll take a look.

I have been struggling for an entire day trying to make this work, that was in april, but I finally switched to another library.
Proxies work very well with node-fetch combined with https-proxy-agent.

commented

Axios default.proxy settings don't work on Chrome.
Any workaround for this?

Axios (v.19) is not working with our corporate proxy for https requests. We use a squid proxy and it returns a protocol error in our case.

You can reproduce the error in node (with a public squid proxy) using latest Axios and an Axios version using 'https-proxy-agent':

run:
npm install axios axios-https-proxy-fix

create file 'index.js' with content:

const axiosDefaultConfig = {
    baseURL: 'https://jsonplaceholder.typicode.com/posts',
    proxy: {
        host: '142.93.165.82',
        port: 8080,
        protocol: 'http'
    }
};

const axios = require ('axios').create(axiosDefaultConfig);
axios.get('42')
    .then(function (response) {
        console.log('Response with axios was ok: ' + response.status);
    })
    .catch(function (error) {
        console.log(error);
    });

const axiosFixed = require ('axios-https-proxy-fix').create(axiosDefaultConfig);
axiosFixed.get('42')
    .then(function (response) {
        console.log('Response with axios-https-proxy-fix was ok: ' + response.status);
    })
    .catch(function (error) {
        console.log(error);
    });

run
node index.js

Then you can see in console log that Axios fails with a protocol error while the modified Axios version using https-proxy-agent succeeds.

I was able to make requests to some servers but not all. Seems like it depends on the servers cipher suites. For all servers with just cipher suites beginning with ECDHE_ the request failed.

Following the axios' code we need to make sure that this if expression is false: http.js#L100 . I fixed the problem with this axios configuration (applying it to @habmukandu code above):

const HttpsProxyAgent = require('https-proxy-agent');

const const axiosDefaultConfig = {
    baseURL: 'https://jsonplaceholder.typicode.com/posts',
    proxy: false,
    httpsAgent: new HttpsProxyAgent('http://142.93.165.82:8080')
};

const axios = require ('axios').create(axiosDefaultConfig);
axios.get('42')
    .then(function (response) {
        console.log('Response with axios was ok: ' + response.status);
    })
    .catch(function (error) {
        console.log(error);
    });

tldr: setup httpsAgent and (!) set proxy: false.

none of these shite solutions work!

@kraiz Tks ! Your solution works for me.

axios-https-proxy-fix will cause Axios to hang indefinitely without timeout or throwing an error conflicting with other libraries in npm. Using node-tunnel (https://github.com/koichik/node-tunnel) to create an agent also works.

const tunnel = require('tunnel');
class ApiService {
  get proxyRequest() {
    const agent = tunnel.httpsOverHttp({
      proxy: {
        host: 'http://proxy.example.com',
        port: 22225,
        proxyAuth: `username:password`,
      },
    });
    return axios.create({
      agent,
    })
  }
}

Hi Is there any known solution to this yet.. I have tried a bunch of stuff but they are not working

@nsharma1989 Use node-tunnel to create an agent that will tunnel through all the proxies. Add the agent as a property to the request object configuration. Post an example of the request you are trying to make.

Hi @adam-s , Thank you for the prompt response I did tried that too however no success. could you help me pointing to a code snippet may be? Thank you
Also I want to ignore the cert_invalid_errors .

const axios = require('axios');
const tunnel = require('tunnel');

const agent = tunnel.httpsOverHttp({
  proxy: {
     host: 'http://proxy.example.com',
     port: 22225
     proxyAuth: `username:password`,
   },
 });

const responsePromise = axios.request({
  url: 'https://github.com/axios/axios/issues/2072',
  method: 'get',
  headers: {
    'User-Agent': 'Chrome',
 },
  agent,
  port: 443,
});

My proxy is over http while the call to github is over https so I use the appropriate method. I read that with tunnel setting the port which is 443 over https might be required, however, it worked without setting it in my case.

@adam-s tried the same but my https request still gives t::ERR_CERT_AUTHORITY_INVALID
after adding rejectUnauthorized: false

@nsharma1989 Sounds frustrating. I can't help beyond my own success using node-tunnel with axios. I don't know if a server can force using a signed certificate or not. I was reading about self-signed certificates which need to be shared between the client and server.

I assume you placed rejectUnauthorized: false on the agent configuration

const agent = tunnel.httpsOverHttp({
  proxy: {
     host: 'http://proxy.example.com',
     port: 22225
     proxyAuth: `username:password`,
   },
  rejectUnauthorized: false,
 });

Sorry I can't be more help.

I have proxy in my package.json and I call my endpoint using axios.get ('/get/GetAllJobs')
On local dev it works, but not after npm run-script build

Let me make some conclusions,

  • For the original issue, as I answered in stackoverflow, axios's config.proxy is Node.js only. I think it is meaningless in browsers. You can check lib/adapters/xhr.js and will find nothing related to proxy there.
  • For other users discussed proxies in Node.js, there were two main ways.