-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.go
More file actions
40 lines (33 loc) · 890 Bytes
/
utils.go
File metadata and controls
40 lines (33 loc) · 890 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package main
import (
"net/url"
"path"
"strings"
)
// ResolveAndCleanURL resolves href against base and sanitizes it:
// - Makes it absolute
// - Strips fragments (#...)
// - Normalizes path (removes duplicate slashes)
func ResolveAndCleanURL(base *url.URL, href string) (*url.URL, error) {
parsedHref, err := url.Parse(href)
if err != nil {
return nil, err
}
// Resolve relative to base if needed
var resolved *url.URL
if parsedHref.IsAbs() {
resolved = parsedHref
} else {
resolved = base.ResolveReference(parsedHref)
}
// Strip fragment
resolved.Fragment = ""
// Normalize path: remove duplicate slashes
resolved.Path = cleanPath(resolved.Path)
return resolved, nil
}
// cleanPath collapses repeated slashes and uses path.Clean for dot segments
func cleanPath(p string) string {
collapsed := strings.ReplaceAll(p, "//", "/")
return path.Clean(collapsed)
}