0
Fork 0
mirror of https://github.com/caddyserver/caddy.git synced 2024-12-23 22:27:38 -05:00
caddy/config/setup/gzip.go

111 lines
2.7 KiB
Go
Raw Normal View History

package setup
import (
"fmt"
"strconv"
"strings"
"github.com/mholt/caddy/middleware"
"github.com/mholt/caddy/middleware/gzip"
)
// Gzip configures a new gzip middleware instance.
func Gzip(c *Controller) (middleware.Middleware, error) {
configs, err := gzipParse(c)
if err != nil {
return nil, err
}
return func(next middleware.Handler) middleware.Handler {
return gzip.Gzip{Next: next, Configs: configs}
}, nil
}
func gzipParse(c *Controller) ([]gzip.Config, error) {
var configs []gzip.Config
for c.Next() {
config := gzip.Config{}
pathFilter := gzip.PathFilter{make(gzip.Set)}
2015-06-10 15:59:08 -05:00
mimeFilter := gzip.MIMEFilter{make(gzip.Set)}
extFilter := gzip.ExtFilter{make(gzip.Set)}
2015-07-01 19:56:30 -05:00
// No extra args expected
if len(c.RemainingArgs()) > 0 {
return configs, c.ArgErr()
}
for c.NextBlock() {
switch c.Val() {
2015-06-10 15:59:08 -05:00
case "mimes":
mimes := c.RemainingArgs()
if len(mimes) == 0 {
return configs, c.ArgErr()
}
for _, m := range mimes {
if !gzip.ValidMIME(m) {
2015-07-01 19:56:30 -05:00
return configs, fmt.Errorf("gzip: invalid MIME %v", m)
2015-06-10 15:59:08 -05:00
}
mimeFilter.Types.Add(m)
}
case "ext":
exts := c.RemainingArgs()
if len(exts) == 0 {
return configs, c.ArgErr()
}
for _, e := range exts {
if !strings.HasPrefix(e, ".") {
2015-07-01 19:56:30 -05:00
return configs, fmt.Errorf(`gzip: invalid extension "%v" (must start with dot)`, e)
}
extFilter.Exts.Add(e)
}
case "not":
paths := c.RemainingArgs()
if len(paths) == 0 {
return configs, c.ArgErr()
}
for _, p := range paths {
2015-07-01 19:56:30 -05:00
if p == "/" {
return configs, fmt.Errorf(`gzip: cannot exclude path "/" - remove directive entirely instead`)
}
if !strings.HasPrefix(p, "/") {
2015-07-01 19:56:30 -05:00
return configs, fmt.Errorf(`gzip: invalid path "%v" (must start with /)`, p)
}
pathFilter.IgnoredPaths.Add(p)
}
case "level":
if !c.NextArg() {
return configs, c.ArgErr()
}
level, _ := strconv.Atoi(c.Val())
config.Level = level
default:
return configs, c.ArgErr()
}
}
2015-06-10 15:59:08 -05:00
config.Filters = []gzip.Filter{}
2015-07-01 19:56:30 -05:00
// If ignored paths are specified, put in front to filter with path first
2015-06-10 15:59:08 -05:00
if len(pathFilter.IgnoredPaths) > 0 {
config.Filters = []gzip.Filter{pathFilter}
}
2015-07-01 19:56:30 -05:00
// If extensions specified, use it over MIME types (if any).
// Otherwise, if specified, use MIME types.
// Otherwise, use default extensions filter.
if len(extFilter.Exts) > 0 {
2015-06-10 15:59:08 -05:00
config.Filters = append(config.Filters, extFilter)
2015-07-01 19:56:30 -05:00
} else if len(mimeFilter.Types) > 0 {
config.Filters = append(config.Filters, mimeFilter)
2015-06-10 15:59:08 -05:00
} else {
2015-07-01 19:56:30 -05:00
config.Filters = append(config.Filters, gzip.DefaultExtFilter())
2015-06-10 15:59:08 -05:00
}
configs = append(configs, config)
}
return configs, nil
}