From ca6b26fe65761e0a6f29d9f5480098de7b1eae68 Mon Sep 17 00:00:00 2001 From: Cameron Moore Date: Thu, 12 May 2016 18:06:56 -0500 Subject: [PATCH] commands: Allow schema-less baseURL on command line Fixes #1632 --- commands/server.go | 41 ++++++++++++++++++++++++----------------- commands/server_test.go | 9 +++++---- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/commands/server.go b/commands/server.go index b851038a1..7294115e3 100644 --- a/commands/server.go +++ b/commands/server.go @@ -209,7 +209,6 @@ func serve(port int) { http.Handle(u.Path, http.StripPrefix(u.Path, fileserver)) } - u.Scheme = "http" jww.FEEDBACK.Printf("Web Server is available at %s (bind address %s)\n", u.String(), serverInterface) fmt.Println("Press Ctrl+C to stop") @@ -229,37 +228,45 @@ func fixURL(s string) (string, error) { s = viper.GetString("BaseURL") useLocalhost = true } - if !strings.HasPrefix(s, "http://") && !strings.HasPrefix(s, "https://") { - s = "http://" + s - } + if !strings.HasSuffix(s, "/") { s = s + "/" } + + // do an initial parse of the input string u, err := url.Parse(s) if err != nil { return "", err } - if serverAppend { - if useLocalhost { - u.Host = fmt.Sprintf("localhost:%d", serverPort) - u.Scheme = "http" - return u.String(), nil + // if no Host is defined, then assume that no schema or double-slash were + // present in the url. Add a double-slash and make a best effort attempt. + if u.Host == "" && s != "/" { + s = "//" + s + + u, err = url.Parse(s) + if err != nil { + return "", err } - host := u.Host - if strings.Contains(host, ":") { - host, _, err = net.SplitHostPort(u.Host) + } + + if useLocalhost { + if u.Scheme == "https" { + u.Scheme = "http" + } + u.Host = "localhost" + } + + if serverAppend { + if strings.Contains(u.Host, ":") { + u.Host, _, err = net.SplitHostPort(u.Host) if err != nil { return "", fmt.Errorf("Failed to split BaseURL hostpost: %s", err) } } - u.Host = fmt.Sprintf("%s:%d", host, serverPort) - return u.String(), nil + u.Host += fmt.Sprintf(":%d", serverPort) } - if useLocalhost { - u.Host = "localhost" - } return u.String(), nil } diff --git a/commands/server_test.go b/commands/server_test.go index d41d630cb..92afe1928 100644 --- a/commands/server_test.go +++ b/commands/server_test.go @@ -36,10 +36,11 @@ func TestFixURL(t *testing.T) { {"Basic subdir", "", "http://foo.com/bar", true, 1313, "http://localhost:1313/bar/"}, {"Basic production", "http://foo.com", "http://foo.com", false, 80, "http://foo.com/"}, {"Production subdir", "http://foo.com/bar", "http://foo.com/bar", false, 80, "http://foo.com/bar/"}, - {"No http", "", "foo.com", true, 1313, "http://localhost:1313/"}, - {"Override configured port", "", "foo.com:2020", true, 1313, "http://localhost:1313/"}, - {"No http production", "foo.com", "foo.com", false, 80, "http://foo.com/"}, - {"No http production with port", "foo.com", "foo.com", true, 2020, "http://foo.com:2020/"}, + {"No http", "", "foo.com", true, 1313, "//localhost:1313/"}, + {"Override configured port", "", "foo.com:2020", true, 1313, "//localhost:1313/"}, + {"No http production", "foo.com", "foo.com", false, 80, "//foo.com/"}, + {"No http production with port", "foo.com", "foo.com", true, 2020, "//foo.com:2020/"}, + {"No config", "", "", true, 1313, "//localhost:1313/"}, } for i, test := range tests {