From 694ee44af6f8a0708af8ff0c693eacb767542f61 Mon Sep 17 00:00:00 2001 From: fatedier Date: Fri, 13 Jan 2017 02:21:17 +0800 Subject: [PATCH] subdomain: subdomain can be configured in frps.ini, fix #220 --- src/cmd/frps/control.go | 28 +++++++++++------------ src/models/client/config.go | 44 ++++++++++++++++++++----------------- src/models/server/config.go | 44 ++++++++++++++++++++++++++++--------- src/models/server/server.go | 1 + 4 files changed, 73 insertions(+), 44 deletions(-) diff --git a/src/cmd/frps/control.go b/src/cmd/frps/control.go index a6cd6a3..d848ccd 100644 --- a/src/cmd/frps/control.go +++ b/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 { diff --git a/src/models/client/config.go b/src/models/client/config.go index d04657b..d669d76 100644 --- a/src/models/client/config.go +++ b/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) } } diff --git a/src/models/server/config.go b/src/models/server/config.go index e52d96c..048e565 100644 --- a/src/models/server/config.go +++ b/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 diff --git a/src/models/server/server.go b/src/models/server/server.go index 27590bf..bcd552f 100644 --- a/src/models/server/server.go +++ b/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