如何使用 gzip 压缩 http.FileServer 内容?

我使用 http.FileServer 作为静态服务器,但我想使用 gzip 压缩


现在的代码:


    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {


        // Static file route


        handle := http.FileServer(http.Dir("resource/dist"))

        w.Header().Set("Content-Encoding", "gzip")


        // ??? use gzip here?


        handle.ServeHTTP(w, r)

    })

并且响应标头已包含 gzip


HTTP/1.1 200 OK

Accept-Ranges: bytes

Content-Encoding: gzip

Content-Type: text/html; charset=utf-8

Last-Modified: Tue, 28 Apr 2020 12:06:15 GMT

Date: Tue, 28 Apr 2020 16:39:40 GMT

Content-Length: 687

那么这里如何使用 gzip 包呢?


冉冉说
浏览 172回答 2
2回答

ABOUTYOU

没有内置gzip传输net/http,需要使用第三方库实现。https://github.com/nytimes/gziphandlerpackage mainimport (    "io"    "net/http"    "github.com/NYTimes/gziphandler")func main() {    withoutGz := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        w.Header().Set("Content-Type", "text/plain")        io.WriteString(w, "Hello, World")    })    withGz := gziphandler.GzipHandler(withoutGz)    http.Handle("/", withGz)    http.ListenAndServe("0.0.0.0:8000", nil)}

呼如林

我根据the42 CJEnright的各种要点整理了这段代码package mainimport (    "compress/gzip"    "io"    "io/ioutil"    "net/http"    "strings"    "sync")var gzPool = sync.Pool{    New: func() interface{} {        w := gzip.NewWriter(ioutil.Discard)        gzip.NewWriterLevel(w, gzip.BestCompression)        return w    },}type gzipResponseWriter struct {    io.Writer    http.ResponseWriter}func (w *gzipResponseWriter) WriteHeader(status int) {    w.Header().Del("Content-Length")    w.ResponseWriter.WriteHeader(status)}func (w *gzipResponseWriter) Write(b []byte) (int, error) {    return w.Writer.Write(b)}// Gzip func handlerfunc Gzip(next http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {            next.ServeHTTP(w, r)            return        }        w.Header().Set("Content-Encoding", "gzip")        gz := gzPool.Get().(*gzip.Writer)        defer gzPool.Put(gz)         gz.Reset(w)       defer gz.Close()       next.ServeHTTP(&gzipResponseWriter{ResponseWriter: w, Writer: gz}, r)    })}func main() {    println("Starting on http://localhost:8080")    http.ListenAndServe(":8080", Gzip(http.FileServer(http.Dir(`.`))))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go