From 805b1e4fa3acb4ed7e4be659b0520dba0cab5da4 Mon Sep 17 00:00:00 2001 From: Andy Hsu Date: Wed, 15 Feb 2023 16:20:30 +0800 Subject: [PATCH] fix: different url encoding (close #3423) --- pkg/utils/url.go | 21 +++++++++++++++++++++ server/handles/down.go | 29 ++++++----------------------- 2 files changed, 27 insertions(+), 23 deletions(-) create mode 100644 pkg/utils/url.go diff --git a/pkg/utils/url.go b/pkg/utils/url.go new file mode 100644 index 00000000..16da1519 --- /dev/null +++ b/pkg/utils/url.go @@ -0,0 +1,21 @@ +package utils + +import ( + "net/url" +) + +func InjectQuery(raw string, query url.Values) (string, error) { + param := query.Encode() + if param == "" { + return raw, nil + } + u, err := url.Parse(raw) + if err != nil { + return "", err + } + joiner := "?" + if u.RawQuery != "" { + joiner = "&" + } + return raw + joiner + param, nil +} diff --git a/server/handles/down.go b/server/handles/down.go index a97f700f..b76eee45 100644 --- a/server/handles/down.go +++ b/server/handles/down.go @@ -2,7 +2,6 @@ package handles import ( "fmt" - "net/url" stdpath "path" "strings" @@ -42,21 +41,13 @@ func Down(c *gin.Context) { c.Header("Referrer-Policy", "no-referrer") c.Header("Cache-Control", "max-age=0, no-cache, no-store, must-revalidate") if setting.GetBool(conf.ForwardDirectLinkParams) { - params := c.Request.URL.Query() - params.Del("sign") - u, err := url.Parse(link.URL) + query := c.Request.URL.Query() + query.Del("sign") + link.URL, err = utils.InjectQuery(link.URL, query) if err != nil { common.ErrorResp(c, err, 500) return } - values := u.Query() - for k := range params { - for i := range params[k] { - values.Set(k, params[k][i]) - } - } - u.RawQuery = values.Encode() - link.URL = u.String() } c.Redirect(302, link.URL) } @@ -92,21 +83,13 @@ func Proxy(c *gin.Context) { return } if link.URL != "" && setting.GetBool(conf.ForwardDirectLinkParams) { - params := c.Request.URL.Query() - params.Del("sign") - u, err := url.Parse(link.URL) + query := c.Request.URL.Query() + query.Del("sign") + link.URL, err = utils.InjectQuery(link.URL, query) if err != nil { common.ErrorResp(c, err, 500) return } - values := u.Query() - for k := range params { - for i := range params[k] { - values.Set(k, params[k][i]) - } - } - u.RawQuery = values.Encode() - link.URL = u.String() } err = common.Proxy(c.Writer, c.Request, link, file) if err != nil {