diff options
Diffstat (limited to 'internal/urllib/url.go')
-rw-r--r-- | internal/urllib/url.go | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/internal/urllib/url.go b/internal/urllib/url.go new file mode 100644 index 00000000..b3e2a546 --- /dev/null +++ b/internal/urllib/url.go @@ -0,0 +1,104 @@ +// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +package urllib // import "miniflux.app/v2/internal/urllib" + +import ( + "fmt" + "net/url" + "strings" +) + +// IsAbsoluteURL returns true if the link is absolute. +func IsAbsoluteURL(link string) bool { + u, err := url.Parse(link) + if err != nil { + return false + } + return u.IsAbs() +} + +// AbsoluteURL converts the input URL as absolute URL if necessary. +func AbsoluteURL(baseURL, input string) (string, error) { + if strings.HasPrefix(input, "//") { + input = "https://" + input[2:] + } + + u, err := url.Parse(input) + if err != nil { + return "", fmt.Errorf("unable to parse input URL: %v", err) + } + + if u.IsAbs() { + return u.String(), nil + } + + base, err := url.Parse(baseURL) + if err != nil { + return "", fmt.Errorf("unable to parse base URL: %v", err) + } + + return base.ResolveReference(u).String(), nil +} + +// RootURL returns absolute URL without the path. +func RootURL(websiteURL string) string { + if strings.HasPrefix(websiteURL, "//") { + websiteURL = "https://" + websiteURL[2:] + } + + absoluteURL, err := AbsoluteURL(websiteURL, "") + if err != nil { + return websiteURL + } + + u, err := url.Parse(absoluteURL) + if err != nil { + return absoluteURL + } + + return u.Scheme + "://" + u.Host + "/" +} + +// IsHTTPS returns true if the URL is using HTTPS. +func IsHTTPS(websiteURL string) bool { + parsedURL, err := url.Parse(websiteURL) + if err != nil { + return false + } + + return strings.ToLower(parsedURL.Scheme) == "https" +} + +// Domain returns only the domain part of the given URL. +func Domain(websiteURL string) string { + parsedURL, err := url.Parse(websiteURL) + if err != nil { + return websiteURL + } + + return parsedURL.Host +} + +// JoinBaseURLAndPath returns a URL string with the provided path elements joined together. +func JoinBaseURLAndPath(baseURL, path string) (string, error) { + if baseURL == "" { + return "", fmt.Errorf("empty base URL") + } + + if path == "" { + return "", fmt.Errorf("empty path") + } + + _, err := url.Parse(baseURL) + if err != nil { + return "", fmt.Errorf("invalid base URL: %w", err) + } + + finalURL, err := url.JoinPath(baseURL, path) + if err != nil { + return "", fmt.Errorf("unable to join base URL %s and path %s: %w", baseURL, path, err) + } + + return finalURL, nil +} |