site
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
2.6 KiB

package site
import (
"errors"
"log"
"net/http"
"strings"
)
func GetSiteInfo(master, host string) (map[string]string, error) {
if master == "" || host == "" {
errors.New("params error")
}
host = strings.Replace(host, "https://", "", 1)
host = strings.Replace(host, "http://", "", 1)
//去掉端口
if strings.Contains(host, ":") {
index := strings.Index(host, ":")
host = host[:index]
}
host = strings.Split(host, ":")[0]
site, err := GetSiteFromRedis(host) //从redis获取
if err != nil {
log.Println("从redis获取分站失败", err)
}
if err == nil && len(site) > 0 {
return site, nil
}
log.Println("从总站", master, "获取分站信息", host)
site, err = GetSiteFromMaster(master, host) //从总站获取
if err != nil {
log.Println("从总站获取分站信息失败", err)
return site, err
}
if len(site) > 0 {
if _, ok := site["database"]; !ok { //检查是否有database
log.Println("站点数据没有database", site)
return site, errors.New("站点数据错误,缺少必要参数")
}
if _, ok := site["site_id"]; !ok { //检查是否有site_id
log.Println("站点数据没有site_id", site)
return site, errors.New("站点数据错误,缺少必要参数")
}
SetToRedis(host, site) //存入redis
return site, nil
} else {
return site, errors.New("数据错误")
}
}
/**
* 取完整数据库名
* 2020/06/15
* gz
*/
func GetDbName(master, host string) (string, error) {
siteInfo, err := GetSiteInfo(master, host)
if err != nil {
return "", err
}
return siteInfo["database"], nil
}
/**
* 取站点ID
* 2020/06/15
* gz
*/
func GetSiteId(master, domain string) (string, error) {
siteInfo, err := GetSiteInfo(master, domain)
if err != nil {
return "", err
}
if _, ok := siteInfo["site_id"]; !ok {
return "", errors.New("没有找到站点ID")
}
return siteInfo["site_id"], nil
}
func GetSiteInfoFromReq(master string, req *http.Request) (map[string]string, error) {
log.Println("header:", req.Header, ";", "body:", req.Body)
host := GetHost(req)
siteInfo, err := GetSiteInfo(master, host)
if err != nil {
return siteInfo, err
}
if len(siteInfo) > 0 {
siteInfo["host"] = host
}
return siteInfo, nil
}
/**
* 取访问主机名
*/
func GetHost(req *http.Request) string {
var hostlist []string = req.Header.Values("X-Forwarded-Host")
var host string
if len(hostlist) > 1 {
host = hostlist[len(hostlist)-1] //取最后一次转发的
} else if len(hostlist) == 1 {
host = hostlist[0]
} else {
host = ""
}
if host != "" {
hosts := strings.Split(host, ",")
host = strings.Trim(hosts[len(hosts)-1], " ")
}
if host == "" {
host = req.Host
}
return host
}