cmd/golangorg: fix golang.google.cn/dl

Fixes golang/go#47750.

Change-Id: I1816df0dbd629705118b6f5b23c264efab73b04b
Reviewed-on: https://go-review.googlesource.com/c/website/+/343009
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jamal Carvalho <jamal@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
Website-Publish: Russ Cox <rsc@golang.org>
diff --git a/cmd/golangorg/server.go b/cmd/golangorg/server.go
index 97be166..cc72ae4 100644
--- a/cmd/golangorg/server.go
+++ b/cmd/golangorg/server.go
@@ -155,7 +155,8 @@
 	if err != nil {
 		log.Fatalf("newSite: %v", err)
 	}
-	if _, err := newSite(mux, "golang.google.cn", content, gorootFS); err != nil {
+	chinaSite, err := newSite(mux, "golang.google.cn", content, gorootFS)
+	if err != nil {
 		log.Fatalf("newSite: %v", err)
 	}
 
@@ -193,12 +194,13 @@
 	}
 
 	if runningOnAppEngine {
-		appEngineSetup(site, mux)
-	} else {
-		// Register a redirect handler for /dl/ to the golang.org download page.
-		mux.Handle("/dl/", http.RedirectHandler("https://golang.org/dl/", http.StatusFound))
+		appEngineSetup(site, chinaSite, mux)
 	}
 
+	// Register a redirect handler for /dl/ to the golang.org download page.
+	// (golang.org/dl and golang.google.cn/dl are registered separately.)
+	mux.Handle("/dl/", http.RedirectHandler("https://golang.org/dl/", http.StatusFound))
+
 	godev, err := godevHandler(filepath.Join(contentDir, "../go.dev/_content"))
 	if err != nil {
 		log.Fatalf("godevHandler: %v", err)
@@ -304,7 +306,7 @@
 	}
 }
 
-func appEngineSetup(site *web.Site, mux *http.ServeMux) {
+func appEngineSetup(site, chinaSite *web.Site, mux *http.ServeMux) {
 	googleAnalytics = os.Getenv("GOLANGORG_ANALYTICS")
 
 	log.Printf("GODEV_IN_GO_DISCOVERY %q PROJECT %q", os.Getenv("GODEV_IN_GO_DISCOVERY"), os.Getenv("PROJECT_ID"))
@@ -329,7 +331,9 @@
 	}
 	memcacheClient := memcache.New(redisAddr)
 
-	dl.RegisterHandlers(mux, site, datastoreClient, memcacheClient)
+	dl.RegisterHandlers(mux, site, "golang.org", datastoreClient, memcacheClient)
+	dl.RegisterHandlers(mux, chinaSite, "golang.google.cn", datastoreClient, memcacheClient)
+
 	short.RegisterHandlers(mux, datastoreClient, memcacheClient)
 	proxy.RegisterHandlers(mux, googleCN)
 
diff --git a/internal/dl/server.go b/internal/dl/server.go
index a663ac8..ba7dbbb 100644
--- a/internal/dl/server.go
+++ b/internal/dl/server.go
@@ -30,11 +30,11 @@
 	memcache  *memcache.CodecClient
 }
 
-func RegisterHandlers(mux *http.ServeMux, site *web.Site, dc *datastore.Client, mc *memcache.Client) {
+func RegisterHandlers(mux *http.ServeMux, site *web.Site, host string, dc *datastore.Client, mc *memcache.Client) {
 	s := server{site, dc, mc.WithCodec(memcache.Gob)}
-	mux.HandleFunc("/dl", s.getHandler)
-	mux.HandleFunc("/dl/", s.getHandler) // also serves listHandler
-	mux.HandleFunc("/dl/upload", s.uploadHandler)
+	mux.HandleFunc(host+"/dl", s.getHandler)
+	mux.HandleFunc(host+"/dl/", s.getHandler) // also serves listHandler
+	mux.HandleFunc(host+"/dl/upload", s.uploadHandler)
 
 	// NOTE(cbro): this only needs to be run once per project,
 	// and should be behind an admin login.