为所有处理程序添加 gzip 压缩

Tal*_*son 3 go

我想向所有处理程序添加 gzip 压缩。这是现在的样子

func gzipHandler(fn http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
            fn(w, r)
            return
        }
        w.Header().Set("Content-Encoding", "gzip")
        gz := gzip.NewWriter(w)
        defer gz.Close()
        fn(gzipResponseWriter{Writer: gz, ResponseWriter: w}, r)
    }
}

http.Handle("/", http.FileServer(http.Dir("./index")))
http.HandleFunc("/json", gzipHandler(sendJSONHandler))
http.HandleFunc("/contact", gzipHandler(contactHandler))
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./static"))))
http.ListenAndServe(":80", cacheHandler(http.DefaultServeMux))
Run Code Online (Sandbox Code Playgroud)

我想做类似最后一行的事情cacheHandler

Cer*_*món 6

更改 gzip 中间件以使用 http.Handler 而不是 http.HandlerFunc:

func gzipHandler(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
            h.ServeHTTP(w, r)
            return
        }
        w.Header().Set("Content-Encoding", "gzip")
        gz := gzip.NewWriter(w)
        defer gz.Close()
        h.ServeHTTP(gzipResponseWriter{Writer: gz, ResponseWriter: w}, r)
    })
}
Run Code Online (Sandbox Code Playgroud)

包装根处理程序:

http.ListenAndServe(":80", gzipHandler(cacheHandler(http.DefaultServeMux)))
Run Code Online (Sandbox Code Playgroud)

如果cacheHandler也是您正在编写的中间件,那么您可能需要组合中间件:

func wrap(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
         w.Header().Set("Cache-Control", "max-age=1800")  // <--- add code from cache handler
        if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
            h.ServeHTTP(w, r)
            return
        }
        w.Header().Set("Content-Encoding", "gzip")
        gz := gzip.NewWriter(w)
        defer gz.Close()
        h.ServeHTTP(gzipResponseWriter{Writer: gz, ResponseWriter: w}, r)
    })
}

...

http.ListenAndServe(":80", wrap(http.DefaultServeMux))
Run Code Online (Sandbox Code Playgroud)