diff options
| author | Matteo Vaccari <matteo.vaccari@gmail.com> | 2024-02-22 11:36:38 +0000 |
|---|---|---|
| committer | Jonathan Amsterdam <jba@google.com> | 2024-02-27 17:34:05 +0000 |
| commit | 9fcffc53593c5cd103630d0d24ef8bd91e17246d (patch) | |
| tree | daa1e1f9751d799dabbd640c90adf71064bf0bf2 | |
| parent | 05845747971c0163c435c35ae8ada07c0fb3b7a8 (diff) | |
| download | go-9fcffc53593c5cd103630d0d24ef8bd91e17246d.tar.xz | |
net/http/pprof: avoid panic with user-defined "GET /" route
With the new routing style in go 1.22, declaring
http.Handle("GET /", h)
generates a conflict with route "/debug/pprof/" and the others declared in
the net/http/pprof package. You get an error such as:
panic: pattern "GET /" (registered at .../pprof.go:94): GET / matches
fewer methods than /debug/pprof/, but has a more general path pattern
This patch prevents that error. Adding GET is correct because no other
method makes sense with the /debug/pprof routes. However, a tool using any
method other than GET will break.
We preserve the traditional behaviour when GODEBUG=httpmuxgo121=1 is
specified.
Updates #65723
Change-Id: I49c21f5f3e802ad7538062d824354b2e4d8a800e
GitHub-Last-Rev: 35e4012663f454fee8f00a321c43592ce4754feb
GitHub-Pull-Request: golang/go#65791
Reviewed-on: https://go-review.googlesource.com/c/go/+/565176
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
| -rw-r--r-- | src/net/http/pprof/pprof.go | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/net/http/pprof/pprof.go b/src/net/http/pprof/pprof.go index 18af18f976..cf4b8415ca 100644 --- a/src/net/http/pprof/pprof.go +++ b/src/net/http/pprof/pprof.go @@ -8,6 +8,7 @@ // The package is typically only imported for the side effect of // registering its HTTP handlers. // The handled paths all begin with /debug/pprof/. +// As of Go 1.22, all the paths must be requested with GET. // // To use pprof, link this package into your program: // @@ -75,6 +76,7 @@ import ( "context" "fmt" "html" + "internal/godebug" "internal/profile" "io" "log" @@ -91,11 +93,15 @@ import ( ) func init() { - http.HandleFunc("/debug/pprof/", Index) - http.HandleFunc("/debug/pprof/cmdline", Cmdline) - http.HandleFunc("/debug/pprof/profile", Profile) - http.HandleFunc("/debug/pprof/symbol", Symbol) - http.HandleFunc("/debug/pprof/trace", Trace) + prefix := "" + if godebug.New("httpmuxgo121").Value() != "1" { + prefix = "GET " + } + http.HandleFunc(prefix+"/debug/pprof/", Index) + http.HandleFunc(prefix+"/debug/pprof/cmdline", Cmdline) + http.HandleFunc(prefix+"/debug/pprof/profile", Profile) + http.HandleFunc(prefix+"/debug/pprof/symbol", Symbol) + http.HandleFunc(prefix+"/debug/pprof/trace", Trace) } // Cmdline responds with the running program's |
