1
0
Эх сурвалжийг харах

subdomain: subdomain can be configured in frps.ini, fix #220

fatedier 8 жил өмнө
parent
commit
694ee44af6

+ 14 - 14
src/cmd/frps/control.go

@@ -268,6 +268,20 @@ func doLogin(req *msg.ControlReq, c *conn.Conn) (ret int64, info string, s *serv
 						return
 					}
 				}
+
+				if s.SubDomain != "" {
+					if strings.Contains(s.SubDomain, ".") || strings.Contains(s.SubDomain, "*") {
+						info = fmt.Sprintf("ProxyName [%s], '.' and '*' is not supported in subdomain", req.ProxyName)
+						log.Warn(info)
+						return
+					}
+					if server.SubDomainHost == "" {
+						info = fmt.Sprintf("ProxyName [%s], subdomain is not supported because this feature is not enabled by remote server", req.ProxyName)
+						log.Warn(info)
+						return
+					}
+					s.SubDomain = s.SubDomain + "." + server.SubDomainHost
+				}
 			}
 			err := server.CreateProxy(s)
 			if err != nil {
@@ -297,20 +311,6 @@ func doLogin(req *msg.ControlReq, c *conn.Conn) (ret int64, info string, s *serv
 		s.HttpUserName = req.HttpUserName
 		s.HttpPassWord = req.HttpPassWord
 
-		// package URL
-		if req.SubDomain != "" {
-			if strings.Contains(req.SubDomain, ".") || strings.Contains(req.SubDomain, "*") {
-				info = fmt.Sprintf("ProxyName [%s], '.' or '*' is not supported in subdomain", req.ProxyName)
-				log.Warn(info)
-				return
-			}
-			if server.SubDomainHost == "" {
-				info = fmt.Sprintf("ProxyName [%s], subdomain in not supported because this feature is not enabled by remote server", req.ProxyName)
-				log.Warn(info)
-				return
-			}
-			s.SubDomain = req.SubDomain + "." + server.SubDomainHost
-		}
 		if req.PoolCount > server.MaxPoolCount {
 			s.PoolCount = server.MaxPoolCount
 		} else if req.PoolCount < 0 {

+ 24 - 20
src/models/client/config.go

@@ -243,44 +243,48 @@ func LoadConf(confFile string) (err error) {
 					}
 				} else if proxyClient.Type == "http" {
 					// custom_domains
-					domainStr, ok := section["custom_domains"]
+					tmpStr, ok = section["custom_domains"]
 					if ok {
-						proxyClient.CustomDomains = strings.Split(domainStr, ",")
-						if len(proxyClient.CustomDomains) == 0 {
-							ok = false
-						} else {
-							for i, domain := range proxyClient.CustomDomains {
-								proxyClient.CustomDomains[i] = strings.ToLower(strings.TrimSpace(domain))
-							}
+						proxyClient.CustomDomains = strings.Split(tmpStr, ",")
+						for i, domain := range proxyClient.CustomDomains {
+							proxyClient.CustomDomains[i] = strings.ToLower(strings.TrimSpace(domain))
 						}
 					}
 
-					if !ok && proxyClient.SubDomain == "" {
+					// subdomain
+					tmpStr, ok = section["subdomain"]
+					if ok {
+						proxyClient.SubDomain = tmpStr
+					}
+
+					if len(proxyClient.CustomDomains) == 0 && proxyClient.SubDomain == "" {
 						return fmt.Errorf("Parse conf error: proxy [%s] custom_domains and subdomain should set at least one of them when type is http", proxyClient.Name)
 					}
 
 					// locations
-					locations, ok := section["locations"]
+					tmpStr, ok = section["locations"]
 					if ok {
-						proxyClient.Locations = strings.Split(locations, ",")
+						proxyClient.Locations = strings.Split(tmpStr, ",")
 					} else {
 						proxyClient.Locations = []string{""}
 					}
 				} else if proxyClient.Type == "https" {
 					// custom_domains
-					domainStr, ok := section["custom_domains"]
+					tmpStr, ok = section["custom_domains"]
 					if ok {
-						proxyClient.CustomDomains = strings.Split(domainStr, ",")
-						if len(proxyClient.CustomDomains) == 0 {
-							ok = false
-						} else {
-							for i, domain := range proxyClient.CustomDomains {
-								proxyClient.CustomDomains[i] = strings.ToLower(strings.TrimSpace(domain))
-							}
+						proxyClient.CustomDomains = strings.Split(tmpStr, ",")
+						for i, domain := range proxyClient.CustomDomains {
+							proxyClient.CustomDomains[i] = strings.ToLower(strings.TrimSpace(domain))
 						}
 					}
 
-					if !ok && proxyClient.SubDomain == "" {
+					// subdomain
+					tmpStr, ok = section["subdomain"]
+					if ok {
+						proxyClient.SubDomain = tmpStr
+					}
+
+					if len(proxyClient.CustomDomains) == 0 && proxyClient.SubDomain == "" {
 						return fmt.Errorf("Parse conf error: proxy [%s] custom_domains and subdomain should set at least one of them when type is https", proxyClient.Name)
 					}
 				}

+ 34 - 10
src/models/server/config.go

@@ -300,9 +300,6 @@ func loadProxyConf(confFile string) (proxyServers map[string]*ProxyServer, err e
 				domainStr, ok := section["custom_domains"]
 				if ok {
 					proxyServer.CustomDomains = strings.Split(domainStr, ",")
-					if len(proxyServer.CustomDomains) == 0 {
-						return proxyServers, fmt.Errorf("Parse conf error: proxy [%s] custom_domains must be set when type is http", proxyServer.Name)
-					}
 					for i, domain := range proxyServer.CustomDomains {
 						domain = strings.ToLower(strings.TrimSpace(domain))
 						// custom domain should not belong to subdomain_host
@@ -311,8 +308,23 @@ func loadProxyConf(confFile string) (proxyServers map[string]*ProxyServer, err e
 						}
 						proxyServer.CustomDomains[i] = domain
 					}
-				} else {
-					return proxyServers, fmt.Errorf("Parse conf error: proxy [%s] custom_domains must be set when type is http", proxyServer.Name)
+				}
+
+				// subdomain
+				subdomainStr, ok := section["subdomain"]
+				if ok {
+					if strings.Contains(subdomainStr, ".") || strings.Contains(subdomainStr, "*") {
+						return proxyServers, fmt.Errorf("Parse conf error: proxy [%s] '.' and '*' is not supported in subdomain", proxyServer.Name)
+					}
+
+					if SubDomainHost == "" {
+						return proxyServers, fmt.Errorf("Parse conf error: proxy [%s] subdomain is not supported because subdomain_host is empty", proxyServer.Name)
+					}
+					proxyServer.SubDomain = subdomainStr + "." + SubDomainHost
+				}
+
+				if len(proxyServer.CustomDomains) == 0 && proxyServer.SubDomain == "" {
+					return proxyServers, fmt.Errorf("Parse conf error: proxy [%s] custom_domains and subdomain should set at least one of them when type is http", proxyServer.Name)
 				}
 
 				// locations
@@ -329,9 +341,6 @@ func loadProxyConf(confFile string) (proxyServers map[string]*ProxyServer, err e
 				domainStr, ok := section["custom_domains"]
 				if ok {
 					proxyServer.CustomDomains = strings.Split(domainStr, ",")
-					if len(proxyServer.CustomDomains) == 0 {
-						return proxyServers, fmt.Errorf("Parse conf error: proxy [%s] custom_domains must be set when type is https", proxyServer.Name)
-					}
 					for i, domain := range proxyServer.CustomDomains {
 						domain = strings.ToLower(strings.TrimSpace(domain))
 						if SubDomainHost != "" && strings.Contains(domain, SubDomainHost) {
@@ -339,8 +348,23 @@ func loadProxyConf(confFile string) (proxyServers map[string]*ProxyServer, err e
 						}
 						proxyServer.CustomDomains[i] = domain
 					}
-				} else {
-					return proxyServers, fmt.Errorf("Parse conf error: proxy [%s] custom_domains must be set when type is https", proxyServer.Name)
+				}
+
+				// subdomain
+				subdomainStr, ok := section["subdomain"]
+				if ok {
+					if strings.Contains(subdomainStr, ".") || strings.Contains(subdomainStr, "*") {
+						return proxyServers, fmt.Errorf("Parse conf error: proxy [%s] '.' and '*' is not supported in subdomain", proxyServer.Name)
+					}
+
+					if SubDomainHost == "" {
+						return proxyServers, fmt.Errorf("Parse conf error: proxy [%s] subdomain is not supported because subdomain_host is empty", proxyServer.Name)
+					}
+					proxyServer.SubDomain = subdomainStr + "." + SubDomainHost
+				}
+
+				if len(proxyServer.CustomDomains) == 0 && proxyServer.SubDomain == "" {
+					return proxyServers, fmt.Errorf("Parse conf error: proxy [%s] custom_domains and subdomain should set at least one of them when type is https", proxyServer.Name)
 				}
 			}
 			proxyServers[proxyServer.Name] = proxyServer

+ 1 - 0
src/models/server/server.go

@@ -79,6 +79,7 @@ func NewProxyServerFromCtlMsg(req *msg.ControlReq) (p *ProxyServer) {
 		p.ListenPort = VhostHttpsPort
 	}
 	p.CustomDomains = req.CustomDomains
+	p.SubDomain = req.SubDomain
 	p.Locations = req.Locations
 	p.HostHeaderRewrite = req.HostHeaderRewrite
 	p.HttpUserName = req.HttpUserName