English | 中文
Gzip Middleware for Go
An out-of-the-box, also customizable gzip middleware for Gin and net/http.
ExamplesDefaultHandler()
Gin
import github.com/nanmu42/gzip func main() { g := gin.Default() // use default settings g.Use(gzip.DefaultHandler().Gin) g.GET("/", func(c *gin.Context) { c.JSON(http.StatusOK, map[string]interface{}{ "code": 0, "msg": "hello", "data": fmt.Sprintf("l%sng!", strings.Repeat("o", 1000)), }) }) log.Println(g.Run(fmt.Sprintf(":%d", 3000))) }
net/http
import github.com/nanmu42/gzip func main() { mux := http.NewServeMux() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { writeString(w, fmt.Sprintf("This content is compressed: l%sng!", strings.Repeat("o", 1000))) }) // wrap http.Handler using default settings log.Println(http.ListenAndServe(fmt.Sprintf(":%d", 3001), gzip.DefaultHandler().WrapHandler(mux))) } func writeString(w http.ResponseWriter, payload string) { w.Header().Set("Content-Type", "text/plain; charset=utf8") _, _ = io.WriteString(w, payload+"\n") }
Customize Handler
NewHandlerConfig
import github.com/nanmu42/gzip handler := gzip.NewHandler(gzip.Config{ // gzip compression level to use CompressionLevel: 6, // minimum content length to trigger gzip, the unit is in byte. MinContentLength: 1024, // RequestFilter decide whether or not to compress response judging by request. // Filters are applied in the sequence here. RequestFilter: []RequestFilter{ NewCommonRequestFilter(), DefaultExtensionFilter(), }, // ResponseHeaderFilter decide whether or not to compress response // judging by response header ResponseHeaderFilter: []ResponseHeaderFilter{ NewSkipCompressedFilter(), DefaultContentTypeFilter(), }, })
RequestFilterResponseHeaderFilter
Performance
This middleware is fine-tuned so that little overhead is added to your program. See benchmarks.
LimitationContent-Typehttp.DetectContentType()Content-LengthMinContentLengthlen(data)http.ResponseWriter.Write(data []byte)
Status: Stable
All APIs are finalized, and no breaking changes will be made in the 1.x series of releases.
AcknowledgementDuring the development of this work, the author took following works/materials as reference:
Logo generated at Gopherize.me.
LicenseMIT License Copyright (c) 2019 LI Zhennan Caddy is licensed under the Apache License Copyright 2015 Light Code Labs, LLC