diff --git a/helpers/url.go b/helpers/url.go index a07a3c6bd..f31e7a4e1 100644 --- a/helpers/url.go +++ b/helpers/url.go @@ -52,9 +52,8 @@ func (PathBridge) Separator() string { var pathBridge PathBridge -// SanitizeUrl sanitizes the input URL string. -func SanitizeUrl(in string) string { - s, err := purell.NormalizeURLString(in, purell.FlagsSafe|purell.FlagRemoveTrailingSlash|purell.FlagRemoveDotSegments|purell.FlagRemoveDuplicateSlashes|purell.FlagRemoveUnnecessaryHostDots|purell.FlagRemoveEmptyPortSeparator) +func sanitizeUrlWithFlags(in string, f purell.NormalizationFlags) string { + s, err := purell.NormalizeURLString(in, f) if err != nil { return in } @@ -85,6 +84,17 @@ func SanitizeUrl(in string) string { // End temporary kludge //return s + +} + +// SanitizeUrl sanitizes the input URL string. +func SanitizeUrl(in string) string { + return sanitizeUrlWithFlags(in, purell.FlagsSafe|purell.FlagRemoveTrailingSlash|purell.FlagRemoveDotSegments|purell.FlagRemoveDuplicateSlashes|purell.FlagRemoveUnnecessaryHostDots|purell.FlagRemoveEmptyPortSeparator) +} + +// SanitizeUrlKeepTrailingSlash is the same as SanitizeUrl, but will keep any trailing slash. +func SanitizeUrlKeepTrailingSlash(in string) string { + return sanitizeUrlWithFlags(in, purell.FlagsSafe|purell.FlagRemoveDotSegments|purell.FlagRemoveDuplicateSlashes|purell.FlagRemoveUnnecessaryHostDots|purell.FlagRemoveEmptyPortSeparator) } // Similar to MakePath, but with Unicode handling diff --git a/helpers/url_test.go b/helpers/url_test.go index e27e2bb02..c38750a63 100644 --- a/helpers/url_test.go +++ b/helpers/url_test.go @@ -1,9 +1,9 @@ package helpers import ( - "testing" - "github.com/stretchr/testify/assert" + "strings" + "testing" ) func TestUrlize(t *testing.T) { @@ -26,6 +26,34 @@ func TestUrlize(t *testing.T) { } } +func TestSanitizeUrl(t *testing.T) { + tests := []struct { + input string + expected string + }{ + {"http://foo.bar/", "http://foo.bar/"}, + {"http://foo.bar/zoo/", "http://foo.bar/zoo"}, // issue #931 + } + + for _, test := range tests { + o1 := SanitizeUrl(test.input) + o2 := SanitizeUrlKeepTrailingSlash(test.input) + + expected2 := test.expected + + if strings.HasSuffix(test.input, "/") && !strings.HasSuffix(expected2, "/") { + expected2 += "/" + } + + if o1 != test.expected { + t.Errorf("Expected %#v, got %#v\n", test.expected, o1) + } + if o2 != expected2 { + t.Errorf("Expected %#v, got %#v\n", expected2, o2) + } + } +} + func TestMakePermalink(t *testing.T) { type test struct { host, link, output string diff --git a/hugolib/site.go b/hugolib/site.go index 0acc287d5..c5b5b85c1 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -444,7 +444,7 @@ func (s *Site) initializeSiteInfo() { } s.Info = SiteInfo{ - BaseUrl: template.URL(helpers.SanitizeUrl(viper.GetString("BaseUrl"))), + BaseUrl: template.URL(helpers.SanitizeUrlKeepTrailingSlash(viper.GetString("BaseUrl"))), Title: viper.GetString("Title"), Author: viper.GetStringMap("author"), LanguageCode: viper.GetString("languagecode"),