60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package handler
|
||
|
||
import (
|
||
"encoding/json"
|
||
"strings"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// PublicOriginFromRequest 根据当前请求还原对外访问根 URL(https://souldev.xxx),
|
||
// 用于开发/预览域名与 API_BASE_URL(常为正式 soulapi)不一致时,头像与 mp_config.apiDomain 与浏览器 Host 对齐。
|
||
func PublicOriginFromRequest(c *gin.Context) string {
|
||
if c == nil || c.Request == nil {
|
||
return ""
|
||
}
|
||
proto := strings.TrimSpace(strings.ToLower(c.GetHeader("X-Forwarded-Proto")))
|
||
switch proto {
|
||
case "":
|
||
if c.Request.TLS != nil {
|
||
proto = "https"
|
||
} else {
|
||
proto = "http"
|
||
}
|
||
case "http", "https":
|
||
default:
|
||
proto = "https"
|
||
}
|
||
host := strings.TrimSpace(c.Request.Host)
|
||
if xfh := c.GetHeader("X-Forwarded-Host"); xfh != "" {
|
||
host = strings.TrimSpace(strings.Split(xfh, ",")[0])
|
||
}
|
||
if host == "" {
|
||
return ""
|
||
}
|
||
return proto + "://" + host
|
||
}
|
||
|
||
// patchMiniprogramConfigJSONOrigin 深拷贝 JSON 响应体并将 mpConfig.apiDomain 改为当前请求的公网 origin(若有)。
|
||
// 避免 souldev 请求却下发 soulapi 域名导致小程序拼接静态资源/头像域名错误。
|
||
func patchMiniprogramConfigJSONOrigin(c *gin.Context, body interface{}) interface{} {
|
||
origin := PublicOriginFromRequest(c)
|
||
if origin == "" || body == nil {
|
||
return body
|
||
}
|
||
b, err := json.Marshal(body)
|
||
if err != nil {
|
||
return body
|
||
}
|
||
var m map[string]interface{}
|
||
if err := json.Unmarshal(b, &m); err != nil {
|
||
return body
|
||
}
|
||
mp, ok := m["mpConfig"].(map[string]interface{})
|
||
if !ok || mp == nil {
|
||
return m
|
||
}
|
||
mp["apiDomain"] = origin
|
||
return m
|
||
}
|