mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-11 12:47:57 +08:00
46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
|
package expvar
|
||
|
|
||
|
import (
|
||
|
"expvar"
|
||
|
"fmt"
|
||
|
"net/http"
|
||
|
|
||
|
"github.com/mholt/caddy/caddyhttp/httpserver"
|
||
|
)
|
||
|
|
||
|
// ExpVar is a simple struct to hold expvar's configuration
|
||
|
type ExpVar struct {
|
||
|
Next httpserver.Handler
|
||
|
Resource Resource
|
||
|
}
|
||
|
|
||
|
// ServeHTTP handles requests to expvar's configured entry point with
|
||
|
// expvar, or passes all other requests up the chain.
|
||
|
func (e ExpVar) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
|
||
|
if httpserver.Path(r.URL.Path).Matches(string(e.Resource)) {
|
||
|
expvarHandler(w, r)
|
||
|
return 0, nil
|
||
|
}
|
||
|
return e.Next.ServeHTTP(w, r)
|
||
|
}
|
||
|
|
||
|
// expvarHandler returns a JSON object will all the published variables.
|
||
|
//
|
||
|
// This is lifted straight from the expvar package.
|
||
|
func expvarHandler(w http.ResponseWriter, r *http.Request) {
|
||
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||
|
fmt.Fprintf(w, "{\n")
|
||
|
first := true
|
||
|
expvar.Do(func(kv expvar.KeyValue) {
|
||
|
if !first {
|
||
|
fmt.Fprintf(w, ",\n")
|
||
|
}
|
||
|
first = false
|
||
|
fmt.Fprintf(w, "%q: %s", kv.Key, kv.Value)
|
||
|
})
|
||
|
fmt.Fprintf(w, "\n}\n")
|
||
|
}
|
||
|
|
||
|
// Resource contains the path to the expvar entry point
|
||
|
type Resource string
|