diff options
author | Frédéric Guillot <fred@miniflux.net> | 2017-12-02 20:26:21 -0800 |
---|---|---|
committer | Frédéric Guillot <fred@miniflux.net> | 2017-12-02 20:26:21 -0800 |
commit | 6f5350a4978c7ef6fa68e526ec8a2ba917d33953 (patch) | |
tree | cabe7a8e49a7563e3f1adf832a6aeee68a7f7fe5 /url | |
parent | 2356ddad28d50aacc8bbb3e020792d3b92f2fb4d (diff) |
Move packages http and url
Diffstat (limited to 'url')
-rw-r--r-- | url/url.go | 71 | ||||
-rw-r--r-- | url/url_test.go | 117 |
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) + } +} |