commands: Allow schema-less baseURL on command line

Fixes #1632
This commit is contained in:
Cameron Moore 2016-05-12 18:06:56 -05:00 committed by Anthony Fok
parent 5572e3496b
commit ca6b26fe65
2 changed files with 29 additions and 21 deletions

View file

@ -209,7 +209,6 @@ func serve(port int) {
http.Handle(u.Path, http.StripPrefix(u.Path, fileserver)) 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) jww.FEEDBACK.Printf("Web Server is available at %s (bind address %s)\n", u.String(), serverInterface)
fmt.Println("Press Ctrl+C to stop") fmt.Println("Press Ctrl+C to stop")
@ -229,37 +228,45 @@ func fixURL(s string) (string, error) {
s = viper.GetString("BaseURL") s = viper.GetString("BaseURL")
useLocalhost = true useLocalhost = true
} }
if !strings.HasPrefix(s, "http://") && !strings.HasPrefix(s, "https://") {
s = "http://" + s
}
if !strings.HasSuffix(s, "/") { if !strings.HasSuffix(s, "/") {
s = s + "/" s = s + "/"
} }
// do an initial parse of the input string
u, err := url.Parse(s) u, err := url.Parse(s)
if err != nil { if err != nil {
return "", err return "", err
} }
if serverAppend { // if no Host is defined, then assume that no schema or double-slash were
if useLocalhost { // present in the url. Add a double-slash and make a best effort attempt.
u.Host = fmt.Sprintf("localhost:%d", serverPort) if u.Host == "" && s != "/" {
u.Scheme = "http" s = "//" + s
return u.String(), nil
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 { if err != nil {
return "", fmt.Errorf("Failed to split BaseURL hostpost: %s", err) return "", fmt.Errorf("Failed to split BaseURL hostpost: %s", err)
} }
} }
u.Host = fmt.Sprintf("%s:%d", host, serverPort) u.Host += fmt.Sprintf(":%d", serverPort)
return u.String(), nil
} }
if useLocalhost {
u.Host = "localhost"
}
return u.String(), nil return u.String(), nil
} }

View file

@ -36,10 +36,11 @@ func TestFixURL(t *testing.T) {
{"Basic subdir", "", "http://foo.com/bar", true, 1313, "http://localhost:1313/bar/"}, {"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/"}, {"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/"}, {"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/"}, {"No http", "", "foo.com", true, 1313, "//localhost:1313/"},
{"Override configured port", "", "foo.com:2020", true, 1313, "http://localhost:1313/"}, {"Override configured port", "", "foo.com:2020", true, 1313, "//localhost:1313/"},
{"No http production", "foo.com", "foo.com", false, 80, "http://foo.com/"}, {"No http production", "foo.com", "foo.com", false, 80, "//foo.com/"},
{"No http production with port", "foo.com", "foo.com", true, 2020, "http://foo.com:2020/"}, {"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 { for i, test := range tests {