aboutsummaryrefslogtreecommitdiff
path: root/internal/urllib/url.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/urllib/url.go')
-rw-r--r--internal/urllib/url.go104
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
+}