mirror of
https://github.com/go-gitea/gitea.git
synced 2026-04-27 03:17:30 +00:00
Follow up #37327. See the comments. * Root problem: the design of OAuth2 providers is a mess, the display name is used as provider's name and used in the URL directly * The regressions: * When trying to fix https://github.com/go-gitea/gitea/issues/36409 , it introduced inconsistent URL escaping for the "path" part. * This fix: always use "path escaping" for the path part, add more tests to cover all escaping cases. Now, frontend "pathEscape" and "pathEscapeSegments" generate exactly the same result as backend.
53 lines
1.4 KiB
Go
53 lines
1.4 KiB
Go
// Copyright 2024 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package context
|
|
|
|
import (
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"code.gitea.io/gitea/modules/setting"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
)
|
|
|
|
// PathParam returns the param in request path, eg: "/{var}" => "/a%2fb", then `var == "a/b"`
|
|
func (b *Base) PathParam(name string) string {
|
|
s, err := url.PathUnescape(b.PathParamRaw(name))
|
|
if err != nil && !setting.IsProd {
|
|
panic("Failed to unescape path param: " + err.Error() + ", there seems to be a double-unescaping bug")
|
|
}
|
|
return s
|
|
}
|
|
|
|
// PathParamRaw returns the raw param in request path, eg: "/{var}" => "/a%2fb", then `var == "a%2fb"`
|
|
func (b *Base) PathParamRaw(name string) string {
|
|
if strings.HasPrefix(name, ":") {
|
|
setting.PanicInDevOrTesting("path param should not start with ':'")
|
|
name = name[1:]
|
|
}
|
|
return chi.URLParam(b.Req, name)
|
|
}
|
|
|
|
// PathParamInt64 returns the param in request path as int64
|
|
func (b *Base) PathParamInt64(p string) int64 {
|
|
v, _ := strconv.ParseInt(b.PathParam(p), 10, 64)
|
|
return v
|
|
}
|
|
|
|
func (b *Base) PathParamInt(p string) int {
|
|
v, _ := strconv.Atoi(b.PathParam(p))
|
|
return v
|
|
}
|
|
|
|
// SetPathParam set request path params into routes
|
|
func (b *Base) SetPathParam(name, value string) {
|
|
chi.RouteContext(b).URLParams.Add(name, url.PathEscape(value))
|
|
}
|
|
|
|
func (b *Base) SetPathParamRaw(name, value string) {
|
|
chi.RouteContext(b).URLParams.Add(name, value)
|
|
}
|