From 9c2b9f74a7c8a3c756e9948814231b8f4e60b216 Mon Sep 17 00:00:00 2001 From: Matteo Vaccari Date: Thu, 15 Feb 2024 16:16:06 +0100 Subject: [PATCH] expvar: avoid conflict 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/vars" declared in the expvar package. You get an error such as: panic: pattern "GET /" (registered at ...) conflicts with pattern "/debug/vars" (registered at ...expvar.go:384): GET / matches fewer methods than /debug/vars, but has a more general path pattern This patch prevents that error. Adding GET is correct because no other method makes sense with /debug/vars. However, a tool using any other methods will break. We preserve the traditional behaviour when GODEBUG=httpmuxgo121=1 is specified. Fixes #65723 --- src/expvar/expvar.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/expvar/expvar.go b/src/expvar/expvar.go index 954d63d17f52b1..5e9034e5d7a976 100644 --- a/src/expvar/expvar.go +++ b/src/expvar/expvar.go @@ -4,7 +4,8 @@ // Package expvar provides a standardized interface to public variables, such // as operation counters in servers. It exposes these variables via HTTP at -// /debug/vars in JSON format. +// /debug/vars in JSON format. As of Go 1.22, the /debug/vars request must +// use GET. // // Operations to set or modify these public variables are atomic. // @@ -23,6 +24,7 @@ package expvar import ( "encoding/json" + "internal/godebug" "log" "math" "net/http" @@ -381,7 +383,11 @@ func memstats() any { } func init() { - http.HandleFunc("/debug/vars", expvarHandler) + if godebug.New("httpmuxgo121").Value() == "1" { + http.HandleFunc("/debug/vars", expvarHandler) + } else { + http.HandleFunc("GET /debug/vars", expvarHandler) + } Publish("cmdline", Func(cmdline)) Publish("memstats", Func(memstats)) }