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

This commit is contained in:
fatedier 2017-01-13 02:21:17 +08:00
parent 0c10279deb
commit 694ee44af6
4 changed files with 73 additions and 44 deletions

View File

@ -268,6 +268,20 @@ func doLogin(req *msg.ControlReq, c *conn.Conn) (ret int64, info string, s *serv
return 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) err := server.CreateProxy(s)
if err != nil { 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.HttpUserName = req.HttpUserName
s.HttpPassWord = req.HttpPassWord 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 { if req.PoolCount > server.MaxPoolCount {
s.PoolCount = server.MaxPoolCount s.PoolCount = server.MaxPoolCount
} else if req.PoolCount < 0 { } else if req.PoolCount < 0 {

View File

@ -243,44 +243,48 @@ func LoadConf(confFile string) (err error) {
} }
} else if proxyClient.Type == "http" { } else if proxyClient.Type == "http" {
// custom_domains // custom_domains
domainStr, ok := section["custom_domains"] tmpStr, ok = section["custom_domains"]
if ok { if ok {
proxyClient.CustomDomains = strings.Split(domainStr, ",") proxyClient.CustomDomains = strings.Split(tmpStr, ",")
if len(proxyClient.CustomDomains) == 0 { for i, domain := range proxyClient.CustomDomains {
ok = false proxyClient.CustomDomains[i] = strings.ToLower(strings.TrimSpace(domain))
} else {
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) 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
locations, ok := section["locations"] tmpStr, ok = section["locations"]
if ok { if ok {
proxyClient.Locations = strings.Split(locations, ",") proxyClient.Locations = strings.Split(tmpStr, ",")
} else { } else {
proxyClient.Locations = []string{""} proxyClient.Locations = []string{""}
} }
} else if proxyClient.Type == "https" { } else if proxyClient.Type == "https" {
// custom_domains // custom_domains
domainStr, ok := section["custom_domains"] tmpStr, ok = section["custom_domains"]
if ok { if ok {
proxyClient.CustomDomains = strings.Split(domainStr, ",") proxyClient.CustomDomains = strings.Split(tmpStr, ",")
if len(proxyClient.CustomDomains) == 0 { for i, domain := range proxyClient.CustomDomains {
ok = false proxyClient.CustomDomains[i] = strings.ToLower(strings.TrimSpace(domain))
} else {
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) 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)
} }
} }

View File

@ -300,9 +300,6 @@ func loadProxyConf(confFile string) (proxyServers map[string]*ProxyServer, err e
domainStr, ok := section["custom_domains"] domainStr, ok := section["custom_domains"]
if ok { if ok {
proxyServer.CustomDomains = strings.Split(domainStr, ",") 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 { for i, domain := range proxyServer.CustomDomains {
domain = strings.ToLower(strings.TrimSpace(domain)) domain = strings.ToLower(strings.TrimSpace(domain))
// custom domain should not belong to subdomain_host // 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 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 // locations
@ -329,9 +341,6 @@ func loadProxyConf(confFile string) (proxyServers map[string]*ProxyServer, err e
domainStr, ok := section["custom_domains"] domainStr, ok := section["custom_domains"]
if ok { if ok {
proxyServer.CustomDomains = strings.Split(domainStr, ",") 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 { for i, domain := range proxyServer.CustomDomains {
domain = strings.ToLower(strings.TrimSpace(domain)) domain = strings.ToLower(strings.TrimSpace(domain))
if SubDomainHost != "" && strings.Contains(domain, SubDomainHost) { if SubDomainHost != "" && strings.Contains(domain, SubDomainHost) {
@ -339,8 +348,23 @@ func loadProxyConf(confFile string) (proxyServers map[string]*ProxyServer, err e
} }
proxyServer.CustomDomains[i] = domain 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 proxyServers[proxyServer.Name] = proxyServer

View File

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