gorilla/mux сам по себе является просто маршрутизатором и диспетчером, который, хотя технически может делать то, что вы просите, на самом деле не предназначен для этого.
«Идиоматический» подход заключается в том, чтобы обернуть обработчик промежуточным программным обеспечением, которое украсит ваш обработчик любыми дополнительными функциями, например, чтобы проверять заголовки для получения некоторой информации о каждом вызове.
Расширение на горилл/мультиплексоров full example, вы могли бы сделать что-то вроде:
package main
import (
"log"
"net/http"
"github.com/gorilla/mux"
)
func HeaderCheckWrapper(requiredHeader string, original func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
if foo, ok := r.Header[requiredHeader]; ok {
// do whatever with the header value, and then call the original:
log.Printf("Found header %q, with value %q", requiredHeader, foo)
original(w, r)
return
}
// otherwise reject the request
w.WriteHeader(http.StatusPreconditionFailed)
w.Write([]byte("missing expected header " + requiredHeader))
}
}
func YourHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Gorilla!\n"))
}
func main() {
r := mux.NewRouter()
// Routes consist of a path and a handler function.
r.HandleFunc("/", HeaderCheckWrapper("X-Foo-Header", YourHandler))
// Bind to a port and pass our router in
log.Fatal(http.ListenAndServe(":8000", r))
}
Вы также можете создать свою собственную функцию промежуточного программного обеспечения и приковать их вместе, используя что-то вроде Алисе. – squiguy