feat(sub): refine Happ routing presets, serverDescription escaping, and auto-detect placement (#6488)

* feat(sub): refine Happ routing presets, serverDescription escaping, and auto-detect placement

* fix(sub): address PR review findings on routing parity, agent regex, and i18n
This commit is contained in:
Pejman Yousefi
2026-09-13 14:23:57 +03:30
committed by GitHub
parent c7518c4038
commit cba8f0672f
10 changed files with 306 additions and 166 deletions
+11 -8
View File
@@ -41,21 +41,25 @@ func IsHappClient(userAgent string) bool {
return happUserAgentRegex.MatchString(userAgent)
}
func sanitizeHeaderValue(v string) string {
return strings.ReplaceAll(strings.ReplaceAll(strings.TrimSpace(v), "\r", ""), "\n", "")
}
// ApplyHappHeaders sets standard and advanced Happ subscription headers.
func ApplyHappHeaders(c *gin.Context, cfg HappConfig, isHapp bool) {
if c == nil || c.Writer == nil || !cfg.AutoDetect || !isHapp {
return
}
if cfg.ProviderId != "" {
c.Writer.Header().Set("ProviderID", cfg.ProviderId)
c.Writer.Header().Set("ProviderID", strings.TrimSpace(cfg.ProviderId))
}
if cfg.NewUrl != "" {
c.Writer.Header().Set("New-Url", cfg.NewUrl)
c.Writer.Header().Set("New-Url", strings.TrimSpace(cfg.NewUrl))
}
if cfg.FallbackUrl != "" {
c.Writer.Header().Set("Fallback-Url", cfg.FallbackUrl)
c.Writer.Header().Set("Fallback-Url", strings.TrimSpace(cfg.FallbackUrl))
}
if text := strings.TrimSpace(cfg.SubInfoText); text != "" {
if text := sanitizeHeaderValue(cfg.SubInfoText); text != "" {
color := strings.TrimSpace(cfg.SubInfoColor)
switch strings.ToLower(color) {
case "primary", "info":
@@ -69,10 +73,10 @@ func ApplyHappHeaders(c *gin.Context, cfg HappConfig, isHapp bool) {
}
c.Writer.Header().Set("Sub-Info-Color", color)
c.Writer.Header().Set("Sub-Info-Text", text)
if btnText := strings.TrimSpace(cfg.SubInfoButtonText); btnText != "" {
if btnText := sanitizeHeaderValue(cfg.SubInfoButtonText); btnText != "" {
c.Writer.Header().Set("Sub-Info-Button-Text", btnText)
}
if btnLink := strings.TrimSpace(cfg.SubInfoButtonLink); btnLink != "" {
if btnLink := sanitizeHeaderValue(cfg.SubInfoButtonLink); btnLink != "" {
c.Writer.Header().Set("Sub-Info-Button-Link", btnLink)
}
}
@@ -103,8 +107,7 @@ func ApplyHappHeaders(c *gin.Context, cfg HappConfig, isHapp bool) {
if cfg.ExcludeApns {
c.Writer.Header().Set("Exclude-Apns-Enable", "true")
}
if profile := strings.TrimSpace(cfg.ColorProfile); profile != "" {
profile = strings.ReplaceAll(strings.ReplaceAll(profile, "\r", ""), "\n", "")
if profile := sanitizeHeaderValue(cfg.ColorProfile); profile != "" {
c.Writer.Header().Set("Color-Profile", profile)
}
if ping := strings.TrimSpace(cfg.PingType); ping != "" {