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