1
0
mirror of https://github.com/golang/go synced 2024-11-26 01:07:57 -07:00

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
This commit is contained in:
Matteo Vaccari 2024-02-15 16:16:06 +01:00
parent b634f6fdcb
commit 9c2b9f74a7

View File

@ -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))
}