From 586bfb9f32f1d916b6246ff7f0bd9ce2818dfab0 Mon Sep 17 00:00:00 2001
From: Lunny Xiao <xiaolunwen@gmail.com>
Date: Mon, 16 Nov 2020 15:33:41 +0800
Subject: [PATCH] Use mount but not register for chi routes (#13555)

* Use mount but not register for chi routes

* Fix test

* Fix test

* Fix test

* Fix comment

* turn back unnecessary change

* Remove the timout middleware since some operations may spend much time.
---
 cmd/web.go                             |  5 +++--
 contrib/pr/checkout.go                 |  3 ++-
 integrations/create_no_session_test.go |  6 ++++--
 integrations/integration_test.go       |  3 ++-
 routers/install.go                     | 10 ++++++----
 routers/routes/chi.go                  | 21 +++++++++++++++------
 6 files changed, 32 insertions(+), 16 deletions(-)

diff --git a/cmd/web.go b/cmd/web.go
index 7dcaee306c07..47dbc2675e24 100644
--- a/cmd/web.go
+++ b/cmd/web.go
@@ -165,9 +165,10 @@ func runWeb(ctx *cli.Context) error {
 			return err
 		}
 	}
-	// Set up Macaron
+	// Set up Chi routes
 	c := routes.NewChi()
-	routes.RegisterRoutes(c)
+	c.Mount("/", routes.NormalRoutes())
+	routes.DelegateToMacaron(c)
 
 	err := listen(c, true)
 	<-graceful.GetManager().Done()
diff --git a/contrib/pr/checkout.go b/contrib/pr/checkout.go
index 7a56b61fe39d..528838082560 100644
--- a/contrib/pr/checkout.go
+++ b/contrib/pr/checkout.go
@@ -118,7 +118,8 @@ func runPR() {
 	external.RegisterParsers()
 	markup.Init()
 	c := routes.NewChi()
-	routes.RegisterRoutes(c)
+	c.Mount("/", routes.NormalRoutes())
+	routes.DelegateToMacaron(c)
 
 	log.Printf("[PR] Ready for testing !\n")
 	log.Printf("[PR] Login with user1, user2, user3, ... with pass: password\n")
diff --git a/integrations/create_no_session_test.go b/integrations/create_no_session_test.go
index 671c6cd51726..ae0d9f812008 100644
--- a/integrations/create_no_session_test.go
+++ b/integrations/create_no_session_test.go
@@ -59,7 +59,8 @@ func TestSessionFileCreation(t *testing.T) {
 	defer func() {
 		setting.SessionConfig.ProviderConfig = oldSessionConfig
 		c = routes.NewChi()
-		routes.RegisterRoutes(c)
+		c.Mount("/", routes.NormalRoutes())
+		routes.DelegateToMacaron(c)
 	}()
 
 	var config session.Options
@@ -84,7 +85,8 @@ func TestSessionFileCreation(t *testing.T) {
 	setting.SessionConfig.ProviderConfig = string(newConfigBytes)
 
 	c = routes.NewChi()
-	routes.RegisterRoutes(c)
+	c.Mount("/", routes.NormalRoutes())
+	routes.DelegateToMacaron(c)
 
 	t.Run("NoSessionOnViewIssue", func(t *testing.T) {
 		defer PrintCurrentTest(t)()
diff --git a/integrations/integration_test.go b/integrations/integration_test.go
index 1e42fb53335f..00aba15603b0 100644
--- a/integrations/integration_test.go
+++ b/integrations/integration_test.go
@@ -68,7 +68,8 @@ func TestMain(m *testing.M) {
 
 	initIntegrationTest()
 	c = routes.NewChi()
-	routes.RegisterRoutes(c)
+	c.Mount("/", routes.NormalRoutes())
+	routes.DelegateToMacaron(c)
 
 	// integration test settings...
 	if setting.Cfg != nil {
diff --git a/routers/install.go b/routers/install.go
index 5d0d089dc08b..4dd934aa04f9 100644
--- a/routers/install.go
+++ b/routers/install.go
@@ -58,18 +58,20 @@ func Install(ctx *context.Context) {
 	form.DbSchema = setting.Database.Schema
 	form.Charset = setting.Database.Charset
 
-	ctx.Data["CurDbOption"] = "MySQL"
+	var curDBOption = "MySQL"
 	switch setting.Database.Type {
 	case "postgres":
-		ctx.Data["CurDbOption"] = "PostgreSQL"
+		curDBOption = "PostgreSQL"
 	case "mssql":
-		ctx.Data["CurDbOption"] = "MSSQL"
+		curDBOption = "MSSQL"
 	case "sqlite3":
 		if setting.EnableSQLite3 {
-			ctx.Data["CurDbOption"] = "SQLite3"
+			curDBOption = "SQLite3"
 		}
 	}
 
+	ctx.Data["CurDbOption"] = curDBOption
+
 	// Application general settings
 	form.AppName = setting.AppName
 	form.RepoRootPath = setting.RepoRootPath
diff --git a/routers/routes/chi.go b/routers/routes/chi.go
index c78fe96ae44a..1165040778d0 100644
--- a/routers/routes/chi.go
+++ b/routers/routes/chi.go
@@ -186,6 +186,7 @@ func storageHandler(storageSetting setting.Storage, prefix string, objStore stor
 // NewChi creates a chi Router
 func NewChi() chi.Router {
 	c := chi.NewRouter()
+	c.Use(middleware.RealIP)
 	if !setting.DisableRouterLog && setting.RouterLogLevel != log.NONE {
 		if log.GetLogger("router").GetLevel() <= setting.RouterLogLevel {
 			c.Use(LoggerHandler(setting.RouterLogLevel))
@@ -195,6 +196,7 @@ func NewChi() chi.Router {
 	if setting.EnableAccessLog {
 		setupAccessLogger(c)
 	}
+
 	if setting.ProdMode {
 		log.Warn("ProdMode ignored")
 	}
@@ -233,28 +235,35 @@ func RegisterInstallRoute(c chi.Router) {
 	})
 }
 
-// RegisterRoutes registers gin routes
-func RegisterRoutes(c chi.Router) {
+// NormalRoutes represents non install routes
+func NormalRoutes() http.Handler {
+	r := chi.NewRouter()
+
 	// for health check
-	c.Head("/", func(w http.ResponseWriter, req *http.Request) {
+	r.Head("/", func(w http.ResponseWriter, req *http.Request) {
 		w.WriteHeader(http.StatusOK)
 	})
 
 	// robots.txt
 	if setting.HasRobotsTxt {
-		c.Get("/robots.txt", func(w http.ResponseWriter, req *http.Request) {
+		r.Get("/robots.txt", func(w http.ResponseWriter, req *http.Request) {
 			http.ServeFile(w, req, path.Join(setting.CustomPath, "robots.txt"))
 		})
 	}
 
+	return r
+}
+
+// DelegateToMacaron delegates other routes to macaron
+func DelegateToMacaron(r chi.Router) {
 	m := NewMacaron()
 	RegisterMacaronRoutes(m)
 
-	c.NotFound(func(w http.ResponseWriter, req *http.Request) {
+	r.NotFound(func(w http.ResponseWriter, req *http.Request) {
 		m.ServeHTTP(w, req)
 	})
 
-	c.MethodNotAllowed(func(w http.ResponseWriter, req *http.Request) {
+	r.MethodNotAllowed(func(w http.ResponseWriter, req *http.Request) {
 		m.ServeHTTP(w, req)
 	})
 }