修复了EQ 曲线接口中,+没有转义成空格的 bug

This commit is contained in:
eafonyang
2026-07-02 12:06:10 +08:00
parent 6e8aa239e8
commit 455bea8380
6 changed files with 63 additions and 75 deletions
+4 -28
View File
@@ -8,7 +8,6 @@ import (
"fmt"
"io"
"net/http"
"net/url"
"strconv"
"strings"
"time"
@@ -54,8 +53,8 @@ func NewCurveHandler(repo *repository.CurveRepository, curveCache *cache.CurveCa
//
// GET /audio/modelCurve?brand=xxx&name=xxx&base64Resp=true
func (h *CurveHandler) ModelCurve(c *gin.Context) {
brand := strings.TrimSpace(queryParam(c, "brand"))
name := strings.TrimSpace(queryParam(c, "name"))
brand := strings.TrimSpace(c.Query("brand"))
name := strings.TrimSpace(c.Query("name"))
base64Resp := encode.ParseBase64Param(c)
if brand == "" || name == "" {
@@ -143,9 +142,8 @@ func (h *CurveHandler) ModelCurve(c *gin.Context) {
//
// GET /audio/getCurve?brand=xxx&name=xxx&target=xxx&base64Resp=true
func (h *CurveHandler) GetCurve(c *gin.Context) {
brand := strings.TrimSpace(queryParam(c, "brand"))
name := strings.TrimSpace(queryParam(c, "name"))
// target 使用标准 query 解码:+ 表示空格(如 Harman+over-ear+2018 → Harman over-ear 2018
brand := strings.TrimSpace(c.Query("brand"))
name := strings.TrimSpace(c.Query("name"))
target := strings.TrimSpace(c.Query("target"))
base64Resp := encode.ParseBase64Param(c)
@@ -557,25 +555,3 @@ func intVal(m map[string]any, key string, defaultVal int) int {
return defaultVal
}
}
// queryParam 从 URL 原始 query 中获取参数,保留 + 为字面量而非空格
func queryParam(c *gin.Context, key string) string {
vals, ok := c.Request.URL.Query()[key]
if !ok || len(vals) == 0 {
return ""
}
// c.Query() 会把 + 解码为空格,这里从原始 query 手动解码,+ 保留为 +
if strings.Contains(vals[0], " ") {
rawQuery := c.Request.URL.RawQuery
for _, pair := range strings.Split(rawQuery, "&") {
kv := strings.SplitN(pair, "=", 2)
if len(kv) == 2 && kv[0] == key {
decoded, err := url.PathUnescape(strings.ReplaceAll(kv[1], "+", "%2B"))
if err == nil {
return decoded
}
}
}
}
return vals[0]
}
+3 -3
View File
@@ -44,9 +44,9 @@ func NewModelCSVHandler(s3 *storage.S3Storage, log *zap.Logger) *ModelCSVHandler
//
// GET /audio/getModelCSV?brand=Abyss&model=Dinan DZ&form=over-ear&base64Resp=true
func (h *ModelCSVHandler) GetModelCSV(c *gin.Context) {
brand := strings.TrimSpace(queryParam(c, "brand"))
model := strings.TrimSpace(queryParam(c, "model"))
form := strings.TrimSpace(queryParam(c, "form"))
brand := strings.TrimSpace(c.Query("brand"))
model := strings.TrimSpace(c.Query("model"))
form := strings.TrimSpace(c.Query("form"))
base64Resp := encode.ParseBase64Param(c)
if brand == "" || model == "" || form == "" {