一尘不染

Golang HTTP Mux更改处理程序功能

go

我对Go来说还很陌生,还无法找到任何有关此的信息,也许目前尚无法解决。

我正在尝试删除或替换多路复用器路由(使用http.NewServeMux或大猩猩的mux.Router)。我的最终目标是能够启用/禁用一条路由或一组路由,而不必重新启动程序。

我可能可以在处理程序到处理程序的基础上完成此操作,并且如果该功能被“禁用”,则只返回404,但是我宁愿找到一种更通用的方法来执行此操作,因为我想为应用程序中的每个路由实现该功能。

还是只跟踪禁用的URL模式并使用一些中间件来防止处理程序执行,我会更好吗?

如果有人至少可以向我指出正确的方向,那么我绝对会发布一个解决方案的代码示例(假设有一个解决方案)。谢谢!


阅读 315

收藏
2020-07-02

共1个答案

一尘不染

没有内置的方式,但是实施play很容易。

type HasHandleFunc interface { //this is just so it would work for gorilla and http.ServerMux
    HandleFunc(pattern string, handler func(w http.ResponseWriter, req *http.Request))
}
type Handler struct {
    http.HandlerFunc
    Enabled bool
}
type Handlers map[string]*Handler

func (h Handlers) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    path := r.URL.Path
    if handler, ok := h[path]; ok && handler.Enabled {
        handler.ServeHTTP(w, r)
    } else {
        http.Error(w, "Not Found", http.StatusNotFound)
    }
}

func (h Handlers) HandleFunc(mux HasHandleFunc, pattern string, handler http.HandlerFunc) {
    h[pattern] = &Handler{handler, true}
    mux.HandleFunc(pattern, h.ServeHTTP)
}

func main() {
    mux := http.NewServeMux()
    handlers := Handlers{}
    handlers.HandleFunc(mux, "/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("this will show once"))
        handlers["/"].Enabled = false
    })
    http.Handle("/", mux)
    http.ListenAndServe(":9020", nil)
}
2020-07-02