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

3 years ago
  1. package site
  2. import (
  3. "errors"
  4. "log"
  5. "net/http"
  6. "strings"
  7. )
  8. func GetSiteInfo(master, host string) (map[string]string, error) {
  9. if master == "" || host == "" {
  10. errors.New("params error")
  11. }
  12. host = strings.Replace(host, "https://", "", 1)
  13. host = strings.Replace(host, "http://", "", 1)
  14. //去掉端口
  15. if strings.Contains(host, ":") {
  16. index := strings.Index(host, ":")
  17. host = host[:index]
  18. }
  19. host = strings.Split(host, ":")[0]
  20. site, err := GetSiteFromRedis(host) //从redis获取
  21. if err != nil {
  22. log.Println("从redis获取分站失败", err)
  23. }
  24. if err == nil && len(site) > 0 {
  25. return site, nil
  26. }
  27. log.Println("从总站", master, "获取分站信息", host)
  28. site, err = GetSiteFromMaster(master, host) //从总站获取
  29. if err != nil {
  30. log.Println("从总站获取分站信息失败", err)
  31. return site, err
  32. }
  33. if len(site) > 0 {
  34. if _, ok := site["database"]; !ok { //检查是否有database
  35. log.Println("站点数据没有database", site)
  36. return site, errors.New("站点数据错误,缺少必要参数")
  37. }
  38. if _, ok := site["site_id"]; !ok { //检查是否有site_id
  39. log.Println("站点数据没有site_id", site)
  40. return site, errors.New("站点数据错误,缺少必要参数")
  41. }
  42. SetToRedis(host, site) //存入redis
  43. return site, nil
  44. } else {
  45. return site, errors.New("数据错误")
  46. }
  47. }
  48. /**
  49. * 取完整数据库名
  50. * 2020/06/15
  51. * gz
  52. */
  53. func GetDbName(master, host string) (string, error) {
  54. siteInfo, err := GetSiteInfo(master, host)
  55. if err != nil {
  56. return "", err
  57. }
  58. return siteInfo["database"], nil
  59. }
  60. /**
  61. * 取站点ID
  62. * 2020/06/15
  63. * gz
  64. */
  65. func GetSiteId(master, domain string) (string, error) {
  66. siteInfo, err := GetSiteInfo(master, domain)
  67. if err != nil {
  68. return "", err
  69. }
  70. if _, ok := siteInfo["site_id"]; !ok {
  71. return "", errors.New("没有找到站点ID")
  72. }
  73. return siteInfo["site_id"], nil
  74. }
  75. func GetSiteInfoFromReq(master string, req *http.Request) (map[string]string, error) {
  76. log.Println("header:", req.Header, ";", "body:", req.Body)
  77. host := GetHost(req)
  78. siteInfo, err := GetSiteInfo(master, host)
  79. if err != nil {
  80. return siteInfo, err
  81. }
  82. if len(siteInfo) > 0 {
  83. siteInfo["host"] = host
  84. }
  85. return siteInfo, nil
  86. }
  87. /**
  88. * 取访问主机名
  89. */
  90. func GetHost(req *http.Request) string {
  91. var hostlist []string = req.Header.Values("X-Forwarded-Host")
  92. var host string
  93. if len(hostlist) > 1 {
  94. host = hostlist[len(hostlist)-1] //取最后一次转发的
  95. } else if len(hostlist) == 1 {
  96. host = hostlist[0]
  97. } else {
  98. host = ""
  99. }
  100. if host != "" {
  101. hosts := strings.Split(host, ",")
  102. host = strings.Trim(hosts[len(hosts)-1], " ")
  103. }
  104. if host == "" {
  105. host = req.Host
  106. }
  107. return host
  108. }