gddo-server: redirect stdlib
Logic is added for selectively redirecting stdlib pages.
Change-Id: I9ba6cecd0108f2d232e0bbf2de00eb43b18cab89
Reviewed-on: https://go-review.googlesource.com/c/gddo/+/285879
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/dynconfig/dynconfig.go b/gddo-server/dynconfig/dynconfig.go
index 4464a60..7a989ee 100644
--- a/gddo-server/dynconfig/dynconfig.go
+++ b/gddo-server/dynconfig/dynconfig.go
@@ -29,6 +29,7 @@
RedirectBadges bool
RedirectHomepage bool
RedirectSearch bool
+ RedirectStdlib bool
RedirectPaths []string
RedirectRollout uint
diff --git a/gddo-server/pkgsite.go b/gddo-server/pkgsite.go
index 033e867..e75d9dc 100644
--- a/gddo-server/pkgsite.go
+++ b/gddo-server/pkgsite.go
@@ -268,6 +268,9 @@
}
return false
}
+ if isStdlibURLPath(r.URL.Path) && cfg.RedirectStdlib {
+ return true
+ }
if cfg.RedirectRollout >= 100 {
return true
@@ -285,6 +288,17 @@
return uint(h.Sum32()%100) < cfg.RedirectRollout
}
+func isStdlibURLPath(path string) bool {
+ if strings.HasPrefix(path, "/-/") {
+ return false
+ }
+ path = strings.TrimPrefix(path, "/")
+ if i := strings.IndexByte(path, '/'); i != -1 {
+ path = path[:i]
+ }
+ return !strings.Contains(path, ".")
+}
+
const goGithubRepoURLPath = "/github.com/golang/go"
func pkgGoDevURL(godocURL *url.URL) *url.URL {
diff --git a/gddo-server/pkgsite_test.go b/gddo-server/pkgsite_test.go
index 8c0dddf..79d86d9 100644
--- a/gddo-server/pkgsite_test.go
+++ b/gddo-server/pkgsite_test.go
@@ -508,8 +508,11 @@
"https://godoc.org/-/go",
"https://godoc.org/-/subrepo",
"https://godoc.org/?q=http",
+ "https://godoc.org/cmd",
"https://godoc.org/net/http",
"https://godoc.org/cloud.google.com/go",
+ "https://godoc.org/github.com/my/module",
+ "https://godoc.org/github.com/my/module/package",
} {
u, err := url.Parse(tu)
if err != nil {
@@ -551,6 +554,16 @@
"https://godoc.org/-/subrepo": true,
},
},
+ {
+ name: "redirect stdlib packages",
+ snapshot: &dynconfig.DynamicConfig{
+ RedirectStdlib: true,
+ },
+ redirect: map[string]bool{
+ "https://godoc.org/net/http": true,
+ "https://godoc.org/cmd": true,
+ },
+ },
} {
t.Run(test.name, func(t *testing.T) {
for _, req := range testRequests {