golang代理转发

杜子龙 · 2019-08-01 14:32:42 · 1213 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2019-08-01 14:32:42 的文章,其中的信息可能已经有所发展或是发生改变。

适用于公司内网请求外网网站,所以需要通过代理转发出去,这里配置一下环境变量COMPANY_HTTP_PROXY、COMPANY_HTTPS_PROXY,通过指定ip请求外网。

// envOnce looks up an environment variable (optionally by multiple
// names) once. It mitigates expensive lookups on some platforms
// (e.g. Windows).
type envOnce struct {
    names []string
    once  sync.Once
    val   string
}

func (e *envOnce) Get() string {
    e.once.Do(e.init)
    return e.val
}

func (e *envOnce) init() {
    for _, n := range e.names {
        e.val = os.Getenv(n)
        if e.val != "" {
            return
        }
    }
}

// reset is used by tests
func (e *envOnce) reset() {
    e.once = sync.Once{}
    e.val = ""
}

var (
    httpProxyEnv = &envOnce{
        names: []string{"COMPANY_HTTP_PROXY", "company_http_proxy"},
    }
    httpsProxyEnv = &envOnce{
        names: []string{"COMPANY_HTTPS_PROXY", "company_https_proxy"},
    }
)

func CompanyProxyFromEnvironment(req *http.Request) (*url.URL, error) {
    var proxy string
    if req.URL.Scheme == "https" {
        proxy = httpsProxyEnv.Get()
    }
    if proxy == "" {
        proxy = httpProxyEnv.Get()
        if proxy != "" && os.Getenv("REQUEST_METHOD") != "" {
            return nil, errors.New("net/http: refusing to use HTTP_PROXY value in CGI environment; see golang.org/s/cgihttpproxy")
        }
    }
    if proxy == "" {
        return nil, nil
    }
    /*默认使用代理
    if !useProxy(canonicalAddr(req.URL)) {
        return nil, nil
    }*/
    proxyURL, err := url.Parse(proxy)
    if err != nil || !strings.HasPrefix(proxyURL.Scheme, "http") {
        // proxy was bogus. Try prepending "http://" to it and
        // see if that parses correctly. If not, we fall
        // through and complain about the original one.
        if proxyURL, err := url.Parse("http://" + proxy); err == nil {
            return proxyURL, nil
        }
    }
    if err != nil {
        return nil, fmt.Errorf("invalid proxy address %q: %v", proxy, err)
    }
    return proxyURL, nil
}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:杜子龙

查看原文:golang代理转发

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1213 次点击  
加入收藏 微博
下一篇:Go Module学习
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传