aboutsummaryrefslogtreecommitdiff
path: root/src/net/http/pprof
diff options
context:
space:
mode:
authorMatteo Vaccari <matteo.vaccari@gmail.com>2024-02-22 11:36:38 +0000
committerJonathan Amsterdam <jba@google.com>2024-02-27 17:34:05 +0000
commit9fcffc53593c5cd103630d0d24ef8bd91e17246d (patch)
treedaa1e1f9751d799dabbd640c90adf71064bf0bf2 /src/net/http/pprof
parent05845747971c0163c435c35ae8ada07c0fb3b7a8 (diff)
downloadgo-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>
Diffstat (limited to 'src/net/http/pprof')
-rw-r--r--src/net/http/pprof/pprof.go16
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