diff options
Diffstat (limited to 'vendor/github.com/gin-contrib/gzip/options.go')
-rw-r--r-- | vendor/github.com/gin-contrib/gzip/options.go | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/vendor/github.com/gin-contrib/gzip/options.go b/vendor/github.com/gin-contrib/gzip/options.go new file mode 100644 index 000000000..6b3bc3f4a --- /dev/null +++ b/vendor/github.com/gin-contrib/gzip/options.go @@ -0,0 +1,116 @@ +package gzip + +import ( + "compress/gzip" + "net/http" + "regexp" + "strings" + + "github.com/gin-gonic/gin" +) + +var ( + DefaultExcludedExtentions = NewExcludedExtensions([]string{ + ".png", ".gif", ".jpeg", ".jpg", + }) + DefaultOptions = &Options{ + ExcludedExtensions: DefaultExcludedExtentions, + } +) + +type Options struct { + ExcludedExtensions ExcludedExtensions + ExcludedPaths ExcludedPaths + ExcludedPathesRegexs ExcludedPathesRegexs + DecompressFn func(c *gin.Context) +} + +type Option func(*Options) + +func WithExcludedExtensions(args []string) Option { + return func(o *Options) { + o.ExcludedExtensions = NewExcludedExtensions(args) + } +} + +func WithExcludedPaths(args []string) Option { + return func(o *Options) { + o.ExcludedPaths = NewExcludedPaths(args) + } +} + +func WithExcludedPathsRegexs(args []string) Option { + return func(o *Options) { + o.ExcludedPathesRegexs = NewExcludedPathesRegexs(args) + } +} + +func WithDecompressFn(decompressFn func(c *gin.Context)) Option { + return func(o *Options) { + o.DecompressFn = decompressFn + } +} + +// Using map for better lookup performance +type ExcludedExtensions map[string]bool + +func NewExcludedExtensions(extensions []string) ExcludedExtensions { + res := make(ExcludedExtensions) + for _, e := range extensions { + res[e] = true + } + return res +} + +func (e ExcludedExtensions) Contains(target string) bool { + _, ok := e[target] + return ok +} + +type ExcludedPaths []string + +func NewExcludedPaths(paths []string) ExcludedPaths { + return ExcludedPaths(paths) +} + +func (e ExcludedPaths) Contains(requestURI string) bool { + for _, path := range e { + if strings.HasPrefix(requestURI, path) { + return true + } + } + return false +} + +type ExcludedPathesRegexs []*regexp.Regexp + +func NewExcludedPathesRegexs(regexs []string) ExcludedPathesRegexs { + result := make([]*regexp.Regexp, len(regexs)) + for i, reg := range regexs { + result[i] = regexp.MustCompile(reg) + } + return result +} + +func (e ExcludedPathesRegexs) Contains(requestURI string) bool { + for _, reg := range e { + if reg.MatchString(requestURI) { + return true + } + } + return false +} + +func DefaultDecompressHandle(c *gin.Context) { + if c.Request.Body == nil { + return + } + r, err := gzip.NewReader(c.Request.Body) + if err != nil { + _ = c.AbortWithError(http.StatusBadRequest, err) + return + } + c.Request.Header.Del("Content-Encoding") + c.Request.Header.Del("Content-Length") + c.Request.Body = r +} |