为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
冉冉说 2022-06-01 15:24:28
我使用 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)    })并且响应标头已包含 gzipHTTP/1.1 200 OKAccept-Ranges: bytesContent-Encoding: gzipContent-Type: text/html; charset=utf-8Last-Modified: Tue, 28 Apr 2020 12:06:15 GMTDate: Tue, 28 Apr 2020 16:39:40 GMTContent-Length: 687那么这里如何使用 gzip 包呢?
查看完整描述

2 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

没有内置gzip传输net/http,需要使用第三方库实现。


https://github.com/nytimes/gziphandler


package main


import (

    "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)

}


查看完整回答
反对 回复 2022-06-01
?
呼如林

TA贡献1798条经验 获得超3个赞

我根据the42 CJEnright的各种要点整理了这段代码


package main


import (

    "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 handler

func 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(`.`))))

}



查看完整回答
反对 回复 2022-06-01
  • 2 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号