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