美文网首页
golang代理转发

golang代理转发

作者: 杜子龙 | 来源:发表于2019-08-01 12:51 被阅读0次

适用于公司内网请求外网网站,所以需要通过代理转发出去,这里配置一下环境变量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代理转发

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

  • Go Git brew 通过代理使用

    1.git通过代理使用 2.Golang通过代理使用 3.brew通过代理使用

  • 基于Golang徒手写个转发代理服务

    由于公司经常需要异地办公,在调试的时候需要用到内网环境,因此手动写了个代理转发服务器給兄弟们用,项目地址是:soc...

  • 使用apache 2.2 mod_proxy做tomcat we

    apache的配置 mod_proxy 支持转发代理和反向代理,所以配置反向代理时首先需要关闭转发代理,关闭方式见...

  • 代理、转发

    代理、转发 正向代理,代理客户端,例如 vpn。 反向代理,代理服务端,例如 Nginx 分发流量。 Nginx可...

  • IDC通过专线内网访问华为云云服务

    目录 1.整体架构 2.配置步骤 2.1 配置dns代理转发 2.2 配置云服务代理转发 2.3配置代理ECS系统...

  • [转]从部署架构角度看Envoy

    Envoy:路由转发和反向代理功能。一般作为网关或者反向代理。代理转发功能类似的有:nginx、kong、envo...

  • HTTP代理

    HTTP代理 1. 什么是HTTP代理? 代理就是接收客户端发送的请求后转发给目标服务器,每次通过代理转发请求或响...

  • go proxy 最快捷的代理抓取工具

    golang-proxy v2.0 Golang-Proxy -- 简单高效的免费代理抓取工具通过抓取网络上公开的...

  • golang简单tcp代理

    使用golang网络编程实现一个简单的TCP代理(不支持HTTP) 使用方式 代理监听9000端口,代理后端服务的...

网友评论

      本文标题:golang代理转发

      本文链接:https://www.haomeiwen.com/subject/jysqdctx.html