Add proxy settings and support for migration and webhook (#16704)
* Add proxy settings and support for migration and webhook * Fix default value * Add newline for example ini * Add lfs proxy support * Fix lint * Follow @zeripath's review * Fix git clone * Fix test * missgin http requests for proxy * use empty Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>tokarchuk/v1.17
parent
422c30d315
commit
f9acad82ca
@ -0,0 +1,83 @@ |
||||
// Copyright 2021 The Gitea Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package proxy |
||||
|
||||
import ( |
||||
"net/http" |
||||
"net/url" |
||||
"os" |
||||
"sync" |
||||
|
||||
"code.gitea.io/gitea/modules/log" |
||||
"code.gitea.io/gitea/modules/setting" |
||||
|
||||
"github.com/gobwas/glob" |
||||
) |
||||
|
||||
var ( |
||||
once sync.Once |
||||
hostMatchers []glob.Glob |
||||
) |
||||
|
||||
// GetProxyURL returns proxy url
|
||||
func GetProxyURL() string { |
||||
if !setting.Proxy.Enabled { |
||||
return "" |
||||
} |
||||
|
||||
if setting.Proxy.ProxyURL == "" { |
||||
if os.Getenv("http_proxy") != "" { |
||||
return os.Getenv("http_proxy") |
||||
} |
||||
return os.Getenv("https_proxy") |
||||
} |
||||
return setting.Proxy.ProxyURL |
||||
} |
||||
|
||||
// Match return true if url needs to be proxied
|
||||
func Match(u string) bool { |
||||
if !setting.Proxy.Enabled { |
||||
return false |
||||
} |
||||
|
||||
// enforce do once
|
||||
Proxy() |
||||
|
||||
for _, v := range hostMatchers { |
||||
if v.Match(u) { |
||||
return true |
||||
} |
||||
} |
||||
return false |
||||
} |
||||
|
||||
// Proxy returns the system proxy
|
||||
func Proxy() func(req *http.Request) (*url.URL, error) { |
||||
if !setting.Proxy.Enabled { |
||||
return nil |
||||
} |
||||
if setting.Proxy.ProxyURL == "" { |
||||
return http.ProxyFromEnvironment |
||||
} |
||||
|
||||
once.Do(func() { |
||||
for _, h := range setting.Proxy.ProxyHosts { |
||||
if g, err := glob.Compile(h); err == nil { |
||||
hostMatchers = append(hostMatchers, g) |
||||
} else { |
||||
log.Error("glob.Compile %s failed: %v", h, err) |
||||
} |
||||
} |
||||
}) |
||||
|
||||
return func(req *http.Request) (*url.URL, error) { |
||||
for _, v := range hostMatchers { |
||||
if v.Match(req.URL.Host) { |
||||
return http.ProxyURL(setting.Proxy.ProxyURLFixed)(req) |
||||
} |
||||
} |
||||
return http.ProxyFromEnvironment(req) |
||||
} |
||||
} |
@ -0,0 +1,40 @@ |
||||
// Copyright 2021 The Gitea Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package setting |
||||
|
||||
import ( |
||||
"net/url" |
||||
|
||||
"code.gitea.io/gitea/modules/log" |
||||
) |
||||
|
||||
var ( |
||||
// Proxy settings
|
||||
Proxy = struct { |
||||
Enabled bool |
||||
ProxyURL string |
||||
ProxyURLFixed *url.URL |
||||
ProxyHosts []string |
||||
}{ |
||||
Enabled: false, |
||||
ProxyURL: "", |
||||
ProxyHosts: []string{}, |
||||
} |
||||
) |
||||
|
||||
func newProxyService() { |
||||
sec := Cfg.Section("proxy") |
||||
Proxy.Enabled = sec.Key("PROXY_ENABLED").MustBool(false) |
||||
Proxy.ProxyURL = sec.Key("PROXY_URL").MustString("") |
||||
if Proxy.ProxyURL != "" { |
||||
var err error |
||||
Proxy.ProxyURLFixed, err = url.Parse(Proxy.ProxyURL) |
||||
if err != nil { |
||||
log.Error("Global PROXY_URL is not valid") |
||||
Proxy.ProxyURL = "" |
||||
} |
||||
} |
||||
Proxy.ProxyHosts = sec.Key("PROXY_HOSTS").Strings(",") |
||||
} |
Loading…
Reference in new issue