Files
EdgeCommon/pkg/serverconfigs/http_gzip_config.go

80 lines
2.1 KiB
Go
Raw Normal View History

2020-09-16 09:09:31 +08:00
package serverconfigs
import (
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
"regexp"
"strings"
)
// 默认的文件类型
var (
DefaultGzipMimeTypes = []string{"text/html", "application/json"}
)
// gzip配置
type HTTPGzipConfig struct {
Id int64 `yaml:"id" json:"id"` // ID
IsOn bool `yaml:"isOn" json:"isOn"` // 是否启用
Level int8 `yaml:"level" json:"level"` // 1-9
MinLength *shared.SizeCapacity `yaml:"minLength" json:"minLength"` // 最小压缩对象比如4m, 24k
MaxLength *shared.SizeCapacity `yaml:"minLength" json:"maxLength"` // 最大压缩对象 TODO 需要实现
MimeTypes []string `yaml:"mimeTypes" json:"mimeTypes"` // 比如text/html, text/* // TODO 需要实现可能需要用RequestConds替代
minLength int64
mimeTypes []*MimeTypeRule
}
// 校验
func (this *HTTPGzipConfig) Init() error {
if this.MinLength != nil {
this.minLength = this.MinLength.Bytes()
}
if len(this.MimeTypes) == 0 {
this.MimeTypes = DefaultGzipMimeTypes
}
this.mimeTypes = []*MimeTypeRule{}
for _, mimeType := range this.MimeTypes {
if strings.Contains(mimeType, "*") {
mimeType = regexp.QuoteMeta(mimeType)
mimeType = strings.Replace(mimeType, "\\*", ".*", -1)
reg, err := regexp.Compile("^" + mimeType + "$")
if err != nil {
return err
}
this.mimeTypes = append(this.mimeTypes, &MimeTypeRule{
Value: mimeType,
Regexp: reg,
})
} else {
this.mimeTypes = append(this.mimeTypes, &MimeTypeRule{
Value: mimeType,
Regexp: nil,
})
}
}
return nil
}
// 可压缩最小尺寸
func (this *HTTPGzipConfig) MinBytes() int64 {
return this.minLength
}
// 检查是否匹配Content-Type
func (this *HTTPGzipConfig) MatchContentType(contentType string) bool {
index := strings.Index(contentType, ";")
if index >= 0 {
contentType = contentType[:index]
}
for _, mimeType := range this.mimeTypes {
if mimeType.Regexp == nil && contentType == mimeType.Value {
return true
} else if mimeType.Regexp != nil && mimeType.Regexp.MatchString(contentType) {
return true
}
}
return false
}