summaryrefslogtreecommitdiff
path: root/vendor/github.com/gin-contrib/gzip/options.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/gin-contrib/gzip/options.go')
-rw-r--r--vendor/github.com/gin-contrib/gzip/options.go270
1 files changed, 0 insertions, 270 deletions
diff --git a/vendor/github.com/gin-contrib/gzip/options.go b/vendor/github.com/gin-contrib/gzip/options.go
deleted file mode 100644
index 67607f51b..000000000
--- a/vendor/github.com/gin-contrib/gzip/options.go
+++ /dev/null
@@ -1,270 +0,0 @@
-package gzip
-
-import (
- "compress/gzip"
- "errors"
- "io"
- "net/http"
- "regexp"
- "strings"
-
- "github.com/gin-gonic/gin"
-)
-
-var (
- // DefaultExcludedExtentions is a predefined list of file extensions that should be excluded from gzip compression.
- // These extensions typically represent image files that are already compressed
- // and do not benefit from additional compression.
- DefaultExcludedExtentions = NewExcludedExtensions([]string{
- ".png", ".gif", ".jpeg", ".jpg",
- })
- // ErrUnsupportedContentEncoding is an error that indicates the content encoding
- // is not supported by the application.
- ErrUnsupportedContentEncoding = errors.New("unsupported content encoding")
-)
-
-// Option is an interface that defines a method to apply a configuration
-// to a given config instance. Implementations of this interface can be
-// used to modify the configuration settings of the logger.
-type Option interface {
- apply(*config)
-}
-
-// Ensures that optionFunc implements the Option interface at compile time.
-// If optionFunc does not implement Option, a compile-time error will occur.
-var _ Option = (*optionFunc)(nil)
-
-type optionFunc func(*config)
-
-func (o optionFunc) apply(c *config) {
- o(c)
-}
-
-type config struct {
- excludedExtensions ExcludedExtensions
- excludedPaths ExcludedPaths
- excludedPathesRegexs ExcludedPathesRegexs
- decompressFn func(c *gin.Context)
- decompressOnly bool
- customShouldCompressFn func(c *gin.Context) bool
-}
-
-// WithExcludedExtensions returns an Option that sets the ExcludedExtensions field of the Options struct.
-// Parameters:
-// - args: []string - A slice of file extensions to exclude from gzip compression.
-func WithExcludedExtensions(args []string) Option {
- return optionFunc(func(o *config) {
- o.excludedExtensions = NewExcludedExtensions(args)
- })
-}
-
-// WithExcludedPaths returns an Option that sets the ExcludedPaths field of the Options struct.
-// Parameters:
-// - args: []string - A slice of paths to exclude from gzip compression.
-func WithExcludedPaths(args []string) Option {
- return optionFunc(func(o *config) {
- o.excludedPaths = NewExcludedPaths(args)
- })
-}
-
-// WithExcludedPathsRegexs returns an Option that sets the ExcludedPathesRegexs field of the Options struct.
-// Parameters:
-// - args: []string - A slice of regex patterns to exclude paths from gzip compression.
-func WithExcludedPathsRegexs(args []string) Option {
- return optionFunc(func(o *config) {
- o.excludedPathesRegexs = NewExcludedPathesRegexs(args)
- })
-}
-
-// WithDecompressFn returns an Option that sets the DecompressFn field of the Options struct.
-// Parameters:
-// - decompressFn: func(c *gin.Context) - A function to handle decompression of incoming requests.
-func WithDecompressFn(decompressFn func(c *gin.Context)) Option {
- return optionFunc(func(o *config) {
- o.decompressFn = decompressFn
- })
-}
-
-// WithDecompressOnly is an option that configures the gzip middleware to only
-// decompress incoming requests without compressing the responses. When this
-// option is enabled, the middleware will set the DecompressOnly field of the
-// Options struct to true.
-func WithDecompressOnly() Option {
- return optionFunc(func(o *config) {
- o.decompressOnly = true
- })
-}
-
-// WithCustomShouldCompressFn returns an Option that sets the CustomShouldCompressFn field of the Options struct.
-// Parameters:
-// - fn: func(c *gin.Context) bool - A function to determine if a request should be compressed.
-// The function should return true if the request should be compressed, false otherwise.
-// If the function returns false, the middleware will not compress the response.
-// If the function is nil, the middleware will use the default logic to determine
-// if the response should be compressed.
-//
-// Returns:
-// - Option - An option that sets the CustomShouldCompressFn field of the Options struct.
-//
-// Example:
-//
-// router.Use(gzip.Gzip(gzip.DefaultCompression, gzip.WithCustomShouldCompressFn(func(c *gin.Context) bool {
-// return c.Request.URL.Path != "/no-compress"
-// })))
-func WithCustomShouldCompressFn(fn func(c *gin.Context) bool) Option {
- return optionFunc(func(o *config) {
- o.customShouldCompressFn = fn
- })
-}
-
-// Using map for better lookup performance
-type ExcludedExtensions map[string]struct{}
-
-// NewExcludedExtensions creates a new ExcludedExtensions map from a slice of file extensions.
-// Parameters:
-// - extensions: []string - A slice of file extensions to exclude from gzip compression.
-//
-// Returns:
-// - ExcludedExtensions - A map of excluded file extensions.
-func NewExcludedExtensions(extensions []string) ExcludedExtensions {
- res := make(ExcludedExtensions, len(extensions))
- for _, e := range extensions {
- res[e] = struct{}{}
- }
- return res
-}
-
-// Contains checks if a given file extension is in the ExcludedExtensions map.
-// Parameters:
-// - target: string - The file extension to check.
-//
-// Returns:
-// - bool - True if the extension is excluded, false otherwise.
-func (e ExcludedExtensions) Contains(target string) bool {
- _, ok := e[target]
- return ok
-}
-
-type ExcludedPaths []string
-
-// NewExcludedPaths creates a new ExcludedPaths slice from a slice of paths.
-// Parameters:
-// - paths: []string - A slice of paths to exclude from gzip compression.
-//
-// Returns:
-// - ExcludedPaths - A slice of excluded paths.
-func NewExcludedPaths(paths []string) ExcludedPaths {
- return ExcludedPaths(paths)
-}
-
-// Contains checks if a given request URI starts with any of the excluded paths.
-// Parameters:
-// - requestURI: string - The request URI to check.
-//
-// Returns:
-// - bool - True if the URI starts with an excluded path, false otherwise.
-func (e ExcludedPaths) Contains(requestURI string) bool {
- for _, path := range e {
- if strings.HasPrefix(requestURI, path) {
- return true
- }
- }
- return false
-}
-
-type ExcludedPathesRegexs []*regexp.Regexp
-
-// NewExcludedPathesRegexs creates a new ExcludedPathesRegexs slice from a slice of regex patterns.
-// Parameters:
-// - regexs: []string - A slice of regex patterns to exclude paths from gzip compression.
-//
-// Returns:
-// - ExcludedPathesRegexs - A slice of excluded path regex patterns.
-func NewExcludedPathesRegexs(regexs []string) ExcludedPathesRegexs {
- result := make(ExcludedPathesRegexs, len(regexs))
- for i, reg := range regexs {
- result[i] = regexp.MustCompile(reg)
- }
- return result
-}
-
-// Contains checks if a given request URI matches any of the excluded path regex patterns.
-// Parameters:
-// - requestURI: string - The request URI to check.
-//
-// Returns:
-// - bool - True if the URI matches an excluded path regex pattern, false otherwise.
-func (e ExcludedPathesRegexs) Contains(requestURI string) bool {
- for _, reg := range e {
- if reg.MatchString(requestURI) {
- return true
- }
- }
- return false
-}
-
-// DefaultDecompressHandle is a middleware function for the Gin framework that
-// decompresses the request body if it is gzip encoded. It checks if the request
-// body is nil and returns immediately if it is. Otherwise, it attempts to create
-// a new gzip reader from the request body. If an error occurs during this process,
-// it aborts the request with a 400 Bad Request status and the error. If successful,
-// it removes the "Content-Encoding" and "Content-Length" headers from the request
-// and replaces the request body with the decompressed reader.
-//
-// Parameters:
-// - c: *gin.Context - The Gin context for the current request.
-func DefaultDecompressHandle(c *gin.Context) {
- if c.Request.Body == nil {
- return
- }
-
- contentEncodingField := strings.Split(strings.ToLower(c.GetHeader("Content-Encoding")), ",")
- if len(contentEncodingField) == 0 { // nothing to decompress
- c.Next()
-
- return
- }
-
- toClose := make([]io.Closer, 0, len(contentEncodingField))
- defer func() {
- for i := len(toClose); i > 0; i-- {
- toClose[i-1].Close()
- }
- }()
-
- // parses multiply gzips like
- // Content-Encoding: gzip, gzip, gzip
- // allowed by RFC
- for i := 0; i < len(contentEncodingField); i++ {
- trimmedValue := strings.TrimSpace(contentEncodingField[i])
-
- if trimmedValue == "" {
- continue
- }
-
- if trimmedValue != "gzip" {
- // According to RFC 7231, Section 3.1.2.2:
- // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.2
- // An origin server MAY respond with a status code of 415 (Unsupported
- // Media Type) if a representation in the request message has a content
- // coding that is not acceptable.
- _ = c.AbortWithError(http.StatusUnsupportedMediaType, ErrUnsupportedContentEncoding)
- }
-
- r, err := gzip.NewReader(c.Request.Body)
- if err != nil {
- _ = c.AbortWithError(http.StatusBadRequest, err)
-
- return
- }
-
- toClose = append(toClose, c.Request.Body)
-
- c.Request.Body = r
- }
-
- c.Request.Header.Del("Content-Encoding")
- c.Request.Header.Del("Content-Length")
-
- c.Next()
-}