aboutsummaryrefslogtreecommitdiffhomepage
path: root/url
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <fred@miniflux.net>2017-12-02 20:26:21 -0800
committerGravatar Frédéric Guillot <fred@miniflux.net>2017-12-02 20:26:21 -0800
commit6f5350a4978c7ef6fa68e526ec8a2ba917d33953 (patch)
treecabe7a8e49a7563e3f1adf832a6aeee68a7f7fe5 /url
parent2356ddad28d50aacc8bbb3e020792d3b92f2fb4d (diff)
Move packages http and url
Diffstat (limited to 'url')
-rw-r--r--url/url.go71
-rw-r--r--url/url_test.go117
2 files changed, 188 insertions, 0 deletions
diff --git a/url/url.go b/url/url.go
new file mode 100644
index 0000000..e5a7c62
--- /dev/null
+++ b/url/url.go
@@ -0,0 +1,71 @@
+// Copyright 2017 Frédéric Guillot. All rights reserved.
+// Use of this source code is governed by the Apache 2.0
+// license that can be found in the LICENSE file.
+
+package url
+
+import "net/url"
+import "fmt"
+import "strings"
+
+// 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
+}
diff --git a/url/url_test.go b/url/url_test.go
new file mode 100644
index 0000000..13c723a
--- /dev/null
+++ b/url/url_test.go
@@ -0,0 +1,117 @@
+package url
+
+import "testing"
+
+func TestGetAbsoluteURLWithAbsolutePath(t *testing.T) {
+ expected := `https://example.org/path/file.ext`
+ input := `/path/file.ext`
+ output, err := AbsoluteURL("https://example.org/folder/", input)
+
+ if err != nil {
+ t.Error(err)
+ }
+
+ if expected != output {
+ t.Errorf(`Unexpected output, got "%s" instead of "%s"`, output, expected)
+ }
+}
+
+func TestGetAbsoluteURLWithRelativePath(t *testing.T) {
+ expected := `https://example.org/folder/path/file.ext`
+ input := `path/file.ext`
+ output, err := AbsoluteURL("https://example.org/folder/", input)
+
+ if err != nil {
+ t.Error(err)
+ }
+
+ if expected != output {
+ t.Errorf(`Unexpected output, got "%s" instead of "%s"`, output, expected)
+ }
+}
+
+func TestGetAbsoluteURLWithRelativePaths(t *testing.T) {
+ expected := `https://example.org/path/file.ext`
+ input := `path/file.ext`
+ output, err := AbsoluteURL("https://example.org/folder", input)
+
+ if err != nil {
+ t.Error(err)
+ }
+
+ if expected != output {
+ t.Errorf(`Unexpected output, got "%s" instead of "%s"`, output, expected)
+ }
+}
+
+func TestWhenInputIsAlreadyAbsolute(t *testing.T) {
+ expected := `https://example.org/path/file.ext`
+ input := `https://example.org/path/file.ext`
+ output, err := AbsoluteURL("https://example.org/folder/", input)
+
+ if err != nil {
+ t.Error(err)
+ }
+
+ if expected != output {
+ t.Errorf(`Unexpected output, got "%s" instead of "%s"`, output, expected)
+ }
+}
+
+func TestGetAbsoluteURLWithProtocolRelative(t *testing.T) {
+ expected := `https://static.example.org/path/file.ext`
+ input := `//static.example.org/path/file.ext`
+ output, err := AbsoluteURL("https://www.example.org/", input)
+
+ if err != nil {
+ t.Error(err)
+ }
+
+ if expected != output {
+ t.Errorf(`Unexpected output, got "%s" instead of "%s"`, output, expected)
+ }
+}
+
+func TestGetRootURL(t *testing.T) {
+ expected := `https://example.org/`
+ input := `https://example.org/path/file.ext`
+ output := RootURL(input)
+
+ if expected != output {
+ t.Errorf(`Unexpected output, got "%s" instead of "%s"`, output, expected)
+ }
+}
+
+func TestGetRootURLWithProtocolRelativePath(t *testing.T) {
+ expected := `https://static.example.org/`
+ input := `//static.example.org/path/file.ext`
+ output := RootURL(input)
+
+ if expected != output {
+ t.Errorf(`Unexpected output, got "%s" instead of "%s"`, output, expected)
+ }
+}
+
+func TestIsHTTPS(t *testing.T) {
+ if !IsHTTPS("https://example.org/") {
+ t.Error("Unable to recognize HTTPS URL")
+ }
+
+ if IsHTTPS("http://example.org/") {
+ t.Error("Unable to recognize HTTP URL")
+ }
+
+ if IsHTTPS("") {
+ t.Error("Unable to recognize malformed URL")
+ }
+}
+
+func TestGetDomain(t *testing.T) {
+ expected := `static.example.org`
+ input := `http://static.example.org/`
+ output := Domain(input)
+
+ if expected != output {
+ t.Errorf(`Unexpected output, got "%s" instead of "%s"`, output, expected)
+ }
+}