From 69d81b656978a03ff277a611f5c3d9ef1814d001 Mon Sep 17 00:00:00 2001
From: zeripath <art27@cantab.net>
Date: Mon, 27 May 2019 22:08:38 +0100
Subject: [PATCH] Handle insecure and ports in go get (#7041)

* Handle insecure and ports in go get

* Fix IsExternalURL for non-standard ports
---
 modules/context/context.go | 10 +++++++++-
 modules/context/repo.go    |  5 ++++-
 modules/util/url.go        |  3 ++-
 modules/util/util_test.go  |  2 +-
 4 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/modules/context/context.go b/modules/context/context.go
index c7534a16cd..1699d7aecc 100644
--- a/modules/context/context.go
+++ b/modules/context/context.go
@@ -257,6 +257,13 @@ func Contexter() macaron.Handler {
 				branchName = repo.DefaultBranch
 			}
 			prefix := setting.AppURL + path.Join(url.PathEscape(ownerName), url.PathEscape(repoName), "src", "branch", util.PathEscapeSegments(branchName))
+
+			appURL, _ := url.Parse(setting.AppURL)
+
+			insecure := ""
+			if appURL.Scheme == string(setting.HTTP) {
+				insecure = "--insecure "
+			}
 			c.Header().Set("Content-Type", "text/html")
 			c.WriteHeader(http.StatusOK)
 			c.Write([]byte(com.Expand(`<!doctype html>
@@ -266,7 +273,7 @@ func Contexter() macaron.Handler {
 		<meta name="go-source" content="{GoGetImport} _ {GoDocDirectory} {GoDocFile}">
 	</head>
 	<body>
-		go get {GoGetImport}
+		go get {Insecure}{GoGetImport}
 	</body>
 </html>
 `, map[string]string{
@@ -274,6 +281,7 @@ func Contexter() macaron.Handler {
 				"CloneLink":      models.ComposeHTTPSCloneURL(ownerName, repoName),
 				"GoDocDirectory": prefix + "{/dir}",
 				"GoDocFile":      prefix + "{/dir}/{file}#L{line}",
+				"Insecure":       insecure,
 			})))
 			return
 		}
diff --git a/modules/context/repo.go b/modules/context/repo.go
index f9ed9327ff..0908340879 100644
--- a/modules/context/repo.go
+++ b/modules/context/repo.go
@@ -188,7 +188,10 @@ func RetrieveBaseRepo(ctx *Context, repo *models.Repository) {
 
 // ComposeGoGetImport returns go-get-import meta content.
 func ComposeGoGetImport(owner, repo string) string {
-	return path.Join(setting.Domain, setting.AppSubURL, url.PathEscape(owner), url.PathEscape(repo))
+	/// setting.AppUrl is guaranteed to be parse as url
+	appURL, _ := url.Parse(setting.AppURL)
+
+	return path.Join(appURL.Host, setting.AppSubURL, url.PathEscape(owner), url.PathEscape(repo))
 }
 
 // EarlyResponseForGoGetMeta responses appropriate go-get meta with status 200
diff --git a/modules/util/url.go b/modules/util/url.go
index 537e4c9b52..263255fcd3 100644
--- a/modules/util/url.go
+++ b/modules/util/url.go
@@ -52,7 +52,8 @@ func IsExternalURL(rawURL string) bool {
 	if err != nil {
 		return true
 	}
-	if len(parsed.Host) != 0 && strings.Replace(parsed.Host, "www.", "", 1) != strings.Replace(setting.Domain, "www.", "", 1) {
+	appURL, _ := url.Parse(setting.AppURL)
+	if len(parsed.Host) != 0 && strings.Replace(parsed.Host, "www.", "", 1) != strings.Replace(appURL.Host, "www.", "", 1) {
 		return true
 	}
 	return false
diff --git a/modules/util/util_test.go b/modules/util/util_test.go
index 3a2b4b71ff..2475065059 100644
--- a/modules/util/util_test.go
+++ b/modules/util/util_test.go
@@ -46,7 +46,7 @@ func TestURLJoin(t *testing.T) {
 }
 
 func TestIsExternalURL(t *testing.T) {
-	setting.Domain = "try.gitea.io"
+	setting.AppURL = "https://try.gitea.io"
 	type test struct {
 		Expected bool
 		RawURL   string