gitech
1// Copyright 2019 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package util
5
6import (
7"net/url"
8"path"
9"strings"
10)
11
12// PathEscapeSegments escapes segments of a path while not escaping forward slash
13func PathEscapeSegments(path string) string {
14slice := strings.Split(path, "/")
15for index := range slice {
16slice[index] = url.PathEscape(slice[index])
17}
18escapedPath := strings.Join(slice, "/")
19return escapedPath
20}
21
22// URLJoin joins url components, like path.Join, but preserving contents
23func URLJoin(base string, elems ...string) string {
24if !strings.HasSuffix(base, "/") {
25base += "/"
26}
27baseURL, err := url.Parse(base)
28if err != nil {
29return ""
30}
31joinedPath := path.Join(elems...)
32argURL, err := url.Parse(joinedPath)
33if err != nil {
34return ""
35}
36joinedURL := baseURL.ResolveReference(argURL).String()
37if !baseURL.IsAbs() && !strings.HasPrefix(base, "/") {
38return joinedURL[1:] // Removing leading '/' if needed
39}
40return joinedURL
41}
42
43func SanitizeURL(s string) (string, error) {
44u, err := url.Parse(s)
45if err != nil {
46return "", err
47}
48u.User = nil
49return u.String(), nil
50}
51