gddo-server: redirect path prefixes

Logic is added to redirect requests based on a provided URL prefix.

Change-Id: I199ec917b6c21c781299cfb9b9a41b4455a7f345
Reviewed-on: https://go-review.googlesource.com/c/gddo/+/285880
Trust: Julie Qiu <julie@golang.org>
Run-TryBot: Julie Qiu <julie@golang.org>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/gddo-server/pkgsite.go b/gddo-server/pkgsite.go
index e75d9dc..2bf2646 100644
--- a/gddo-server/pkgsite.go
+++ b/gddo-server/pkgsite.go
@@ -256,6 +256,8 @@
 	for _, p := range cfg.RedirectPaths {
 		if r.URL.Path == p {
 			return true
+		} else if !strings.HasPrefix(r.URL.Path, "/-/") && strings.HasPrefix(r.URL.Path, p+"/") {
+			return true
 		}
 	}
 	q := strings.TrimSpace(r.Form.Get("q"))
diff --git a/gddo-server/pkgsite_test.go b/gddo-server/pkgsite_test.go
index 79d86d9..1acfee8 100644
--- a/gddo-server/pkgsite_test.go
+++ b/gddo-server/pkgsite_test.go
@@ -504,6 +504,8 @@
 		"https://api.godoc.org/-/net/http",
 		"https://godoc.org",
 		"https://godoc.org/-/about",
+		"https://godoc.org/-/aboutfoo",
+		"https://godoc.org/-/about/foobar",
 		"https://godoc.org/-/bot",
 		"https://godoc.org/-/go",
 		"https://godoc.org/-/subrepo",
@@ -511,6 +513,9 @@
 		"https://godoc.org/cmd",
 		"https://godoc.org/net/http",
 		"https://godoc.org/cloud.google.com/go",
+		"https://godoc.org/cloud.google.com/go/pubsub",
+		"https://godoc.org/cloud.google.com/go/storage",
+		"https://godoc.org/cloud.google.com/go/storage/internal",
 		"https://godoc.org/github.com/my/module",
 		"https://godoc.org/github.com/my/module/package",
 	} {
@@ -564,6 +569,18 @@
 				"https://godoc.org/cmd":      true,
 			},
 		},
+		{
+			name: "redirect cloud.google.com/go",
+			snapshot: &dynconfig.DynamicConfig{
+				RedirectPaths: []string{"/cloud.google.com/go"},
+			},
+			redirect: map[string]bool{
+				"https://godoc.org/cloud.google.com/go":                  true,
+				"https://godoc.org/cloud.google.com/go/pubsub":           true,
+				"https://godoc.org/cloud.google.com/go/storage":          true,
+				"https://godoc.org/cloud.google.com/go/storage/internal": true,
+			},
+		},
 	} {
 		t.Run(test.name, func(t *testing.T) {
 			for _, req := range testRequests {