diff options
author | 2022-02-19 12:12:41 +0100 | |
---|---|---|
committer | 2022-02-19 12:12:41 +0100 | |
commit | a089a98ea9874f339e635700dfdb00c91f10b4d5 (patch) | |
tree | f19a0fd85740756be16fad9a25abfb5d4ebb8f0a /vendor/github.com/gin-contrib/gzip/handler.go | |
parent | [feature] Stream files via reader (#404) (diff) | |
download | gotosocial-a089a98ea9874f339e635700dfdb00c91f10b4d5.tar.xz |
[feature] Gin enable gzip encoding (#405)
* add gin gzip dependency
* add gzip middleware to router
* go mod tidy
Diffstat (limited to 'vendor/github.com/gin-contrib/gzip/handler.go')
-rw-r--r-- | vendor/github.com/gin-contrib/gzip/handler.go | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/vendor/github.com/gin-contrib/gzip/handler.go b/vendor/github.com/gin-contrib/gzip/handler.go new file mode 100644 index 000000000..58f87db9b --- /dev/null +++ b/vendor/github.com/gin-contrib/gzip/handler.go @@ -0,0 +1,84 @@ +package gzip + +import ( + "compress/gzip" + "fmt" + "io/ioutil" + "net/http" + "path/filepath" + "strings" + "sync" + + "github.com/gin-gonic/gin" +) + +type gzipHandler struct { + *Options + gzPool sync.Pool +} + +func newGzipHandler(level int, options ...Option) *gzipHandler { + handler := &gzipHandler{ + Options: DefaultOptions, + gzPool: sync.Pool{ + New: func() interface{} { + gz, err := gzip.NewWriterLevel(ioutil.Discard, level) + if err != nil { + panic(err) + } + return gz + }, + }, + } + for _, setter := range options { + setter(handler.Options) + } + return handler +} + +func (g *gzipHandler) Handle(c *gin.Context) { + if fn := g.DecompressFn; fn != nil && c.Request.Header.Get("Content-Encoding") == "gzip" { + fn(c) + } + + if !g.shouldCompress(c.Request) { + return + } + + gz := g.gzPool.Get().(*gzip.Writer) + defer g.gzPool.Put(gz) + defer gz.Reset(ioutil.Discard) + gz.Reset(c.Writer) + + c.Header("Content-Encoding", "gzip") + c.Header("Vary", "Accept-Encoding") + c.Writer = &gzipWriter{c.Writer, gz} + defer func() { + gz.Close() + c.Header("Content-Length", fmt.Sprint(c.Writer.Size())) + }() + c.Next() +} + +func (g *gzipHandler) shouldCompress(req *http.Request) bool { + if !strings.Contains(req.Header.Get("Accept-Encoding"), "gzip") || + strings.Contains(req.Header.Get("Connection"), "Upgrade") || + strings.Contains(req.Header.Get("Accept"), "text/event-stream") { + + return false + } + + extension := filepath.Ext(req.URL.Path) + if g.ExcludedExtensions.Contains(extension) { + return false + } + + if g.ExcludedPaths.Contains(req.URL.Path) { + return false + } + if g.ExcludedPathesRegexs.Contains(req.URL.Path) { + return false + } + + return true +} |