缘起
在使用google的hg和Google-cloud-sdk时都会遇到需要设置http代理的问题;
方式1: export http_proxy=10.xx.xx.xx:8888 // 无效
方式2: export http_proxy=http://10.xx.xx.xx:8888 // 无效
方式3: export https_proxy=http://10.xx.xx.xx:8888 // 无效
为什么?
分析
通过下面对使用的python的httplib2的代码分析发现:
- http_proxy 或https_proxy 大小写不敏感,也可以写作: HTTP_PROXY HTTPS_PROXY (当然,别大小写同时存在)
- 代理的形式必须是url形式,如: http://host:port
- 对于http请求只参考 HTTP_PROXY , 对于 https 请求只参考 HTTPS_PROXY
- 可以通过 no_proxy (大小写不敏感)环境变量使得部分指定的域名不走代理,多个域名用“逗号”分隔,“*”代表所有
其他:
对于Go写的程序来讲,对于https请求来讲,优先参考 https_proxy,然后参考http_proxy; 参考: net/http/transport.go
所以,如果有类似错误如下:
Get https://code.google.com/p/snappy-go/source/checkout?repo=: x509: certificate has expired or is not yet valid
请检查是否需要设置 http_proxy
关于 no_proxy 的进一步说明:
在玩docker的时候,由于docker是不欢迎 http_proxy https_proxy 这些环境变量的,于是添加 no_proxy 环境变量绕过,如下:
1 |
export no_proxy=$no_proxy,/var/run/docker.sock |
看起来似乎没啥问题,但是问题还是出现了,由于no_proxy 原本是 空的,于是现在的no_proxy 就成了:
1 |
,/var/run/docker.sock |
似乎也没啥问题呀,但是cloud sdk的httplib2 不小心把 空 匹配了所有域名了,代码如下: (坑爹不?)