Axios Https 走 Http Proxy 的坑

自从写 JavaScript 之后越来越觉得它真的很好玩。异步, Promise, 回调函数。各种各样的神奇姿势~

最近,两个月前开始的,中间鸽了很久。博客也没更很久了打算以社团的名义折腾一个 RSS 的网站放到学校的服务器里。网站的其中一个部分是用 RSSHub ,请求外部网站生成 RSS 订阅源。学校的服务器要通过 Http Proxy 才能访问外网。RSSHub 用的是 axios。 支持 Promise 兼容浏览器 XMLHttpRequest 和 node 的 http 请求。还有拦截器等各种操作,很爽。但是 http proxy 就出问题了。

axios 中的 HTTP Proxy

axios 本身支持 http proxy

1
2
3
4
5
6
7
proxy: {
host: '127.0.0.1',
port: 9000,
auth: {
username: 'mikeymike',
password: 'rapunz3l'
}

本来是很简单很舒服。但是访问 https 网站是就会出现类似这样的东西

1
Error: write EPROTO 140736379442112:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:794

解决问题

node 不行,但是服务器命令行中用curl访问 https 网站没有问题。
Google 后发现是 axios 的问题,而且已经有修复了 Pre-release(v0.19.0-beta.1)
axios pre-release
然而,安了新版之后问题并没有解决,反而多了很多的 501错误
网络世界那么大,我果然不是第一个遇到问题的人。用 axios-https-proxy-fix 问题就解决了。
看了一下源代码改动发现用了 HttpsProxyAgent 包的实例 agent 替换了 config 里面的 httpAgent。config 就是 axios 做第二个参数的对象。
这个包没更新到最新的axios,强迫症的我受不了。于是就模仿这个思路放在了axios的拦截器中。

1
2
3
4
5
6
7
8
9
10
11
const axios = require('axios');
const tunnel = require('tunnel');

const agent = tunnel.httpsOverHttp({proxy: config.proxy});
axios.interceptors.request.use(function (config) {
if(config.url.indexOf('https') !== -1) {
config.httpsAgent = agent;
config.proxy = false;
}
return config;
});

tunnelHttpsProxyAgent 用法一样但是不用自己手动构造url。这样就可以满足我追更新的强迫症了。

0%