1 Star 0 Fork 4

amative_man / gzip

forked from 楠木 / gzip 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.Chinese.md 4.09 KB
一键复制 编辑 原始数据 按行查看 历史
楠木 提交于 2020-04-26 11:05 . doc: add logo credit

English | 中文

gzip

GoDoc Build status codecov Lint status Go Report Card

一个开箱即用,可定制,适用于Ginnet/http的gzip中间件。

Golang Gzip Middleware

使用示例

默认设置DefaultHandler()可以满足大部分场景。

Gin

import github.com/nanmu42/gzip

func main() {
	g := gin.Default()
	
    // 使用默认设定
	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)))
	})

    // 使用默认设定
	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")
}

定制Handler

使用NewHandler()可以定制参数以满足你的特殊需要:

import github.com/nanmu42/gzip

handler := gzip.NewHandler(gzip.Config{
    // gzip压缩等级
	CompressionLevel: 6,
    // 触发gzip的最小body体积,单位:byte
	MinContentLength: 1024,
    // 请求过滤器基于请求来判断是否对这条请求的返回启用gzip,
    // 过滤器按其定义顺序执行,下同。
	RequestFilter: []RequestFilter{
	    NewCommonRequestFilter(),
	    DefaultExtensionFilter(),
	},
    // 返回header过滤器基于返回的header判断是否对这条请求的返回启用gzip
	ResponseHeaderFilter: []ResponseHeaderFilter{
		NewSkipCompressedFilter(),
		DefaultContentTypeFilter(),
	},
})

RequestFilterResponseHeaderFilter 是 interface. 你可以实现你自己的过滤器。

效率

本中间件经过了性能调优,以确保高效运行,查看benchmark

局限性

  • 你应该总是在返回中提供Content-Type。虽然Handler会在Content-Type缺失时使用http.DetectContentType()进行猜测,但是效果并没有那么好;
  • 返回的Content-Length 缺失时,Handler可能会缓冲返回的报文数据以决定报文是否大到值得进行压缩,如果MinContentLength设置得太大,这个过程可能会带来内存压力。Handler针对这个情况做了一些优化,例如查看http.ResponseWriter.Write(data []byte)在首次调用时的 len(data),以及资源复用。

项目状态:稳定

API已经稳定,1.x版本中的更新会向前兼容。

致谢

在本项目的开发中,作者参考了下列项目和资料:

Logo在Gopherize.me生成。

License

MIT License
Copyright (c) 2019 LI Zhennan

Caddy is licensed under the Apache License
Copyright 2015 Light Code Labs, LLC
Go
1
https://gitee.com/amative/gzip.git
git@gitee.com:amative/gzip.git
amative
gzip
gzip
master

搜索帮助