mirror of
https://github.com/TeaOSLab/EdgeCommon.git
synced 2025-11-03 20:40:25 +08:00
165 lines
3.9 KiB
Go
165 lines
3.9 KiB
Go
// Copyright 2021 GoEdge CDN goedge.cdn@gmail.com. All rights reserved.
|
||
|
||
package serverconfigs
|
||
|
||
import (
|
||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
|
||
"strings"
|
||
)
|
||
|
||
// WebPImageConfig WebP配置
|
||
type WebPImageConfig struct {
|
||
IsPrior bool `yaml:"isPrior" json:"isPrior"`
|
||
IsOn bool `yaml:"isOn" json:"isOn"`
|
||
|
||
MinLength *shared.SizeCapacity `yaml:"minLength" json:"minLength"` // 最小压缩对象比如4m, 24k
|
||
MaxLength *shared.SizeCapacity `yaml:"maxLength" json:"maxLength"` // 最大压缩对象
|
||
MimeTypes []string `yaml:"mimeTypes" json:"mimeTypes"` // 支持的MimeType,支持image/*这样的通配符使用
|
||
Extensions []string `yaml:"extensions" json:"extensions"` // 文件扩展名,包含点符号,不区分大小写
|
||
Conds *shared.HTTPRequestCondsConfig `yaml:"conds" json:"conds"` // 匹配条件
|
||
|
||
minLength int64
|
||
maxLength int64
|
||
mimeTypeRules []*shared.MimeTypeRule
|
||
extensions []string
|
||
}
|
||
|
||
func (this *WebPImageConfig) Init() error {
|
||
if this.MinLength != nil {
|
||
this.minLength = this.MinLength.Bytes()
|
||
}
|
||
if this.MaxLength != nil {
|
||
this.maxLength = this.MaxLength.Bytes()
|
||
}
|
||
|
||
if this.Conds != nil {
|
||
err := this.Conds.Init()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
}
|
||
|
||
// mime types
|
||
this.mimeTypeRules = []*shared.MimeTypeRule{}
|
||
for _, mimeType := range this.MimeTypes {
|
||
rule, err := shared.NewMimeTypeRule(mimeType)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
this.mimeTypeRules = append(this.mimeTypeRules, rule)
|
||
}
|
||
|
||
// extensions
|
||
this.extensions = []string{}
|
||
for _, ext := range this.Extensions {
|
||
ext = strings.ToLower(ext)
|
||
if len(ext) > 0 && ext[0] != '.' {
|
||
ext = "." + ext
|
||
}
|
||
this.extensions = append(this.extensions, ext)
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
// MatchResponse 是否匹配响应
|
||
func (this *WebPImageConfig) MatchResponse(mimeType string, contentLength int64, requestExt string, formatter shared.Formatter) bool {
|
||
if this.Conds != nil && formatter != nil {
|
||
if !this.Conds.MatchRequest(formatter) {
|
||
return false
|
||
}
|
||
if !this.Conds.MatchResponse(formatter) {
|
||
return false
|
||
}
|
||
}
|
||
|
||
// no content
|
||
if contentLength == 0 {
|
||
return false
|
||
}
|
||
|
||
// min length
|
||
if this.minLength > 0 && contentLength >= 0 && contentLength < this.minLength {
|
||
return false
|
||
}
|
||
|
||
// max length
|
||
if this.maxLength > 0 && contentLength > this.maxLength {
|
||
return false
|
||
}
|
||
|
||
// extensions
|
||
if len(this.extensions) > 0 {
|
||
if len(requestExt) > 0 {
|
||
for _, ext := range this.extensions {
|
||
if ext == requestExt {
|
||
if strings.Contains(mimeType, "image/") {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// mime types
|
||
if len(this.mimeTypeRules) > 0 {
|
||
if len(mimeType) > 0 {
|
||
var index = strings.Index(mimeType, ";")
|
||
if index >= 0 {
|
||
mimeType = mimeType[:index]
|
||
}
|
||
for _, rule := range this.mimeTypeRules {
|
||
if rule.Match(mimeType) {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 如果没有指定条件,则所有的都能压缩
|
||
if len(this.extensions) == 0 && len(this.mimeTypeRules) == 0 {
|
||
return true
|
||
}
|
||
|
||
return false
|
||
}
|
||
|
||
// MatchRequest 是否匹配请求
|
||
func (this *WebPImageConfig) MatchRequest(requestExt string, formatter shared.Formatter) bool {
|
||
if this.Conds != nil && formatter != nil {
|
||
if !this.Conds.MatchRequest(formatter) {
|
||
return false
|
||
}
|
||
}
|
||
|
||
// extensions
|
||
if len(this.mimeTypeRules) == 0 && len(this.extensions) > 0 && len(requestExt) > 0 {
|
||
for _, ext := range this.extensions {
|
||
if ext == requestExt {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|
||
|
||
return true
|
||
}
|
||
|
||
// MatchAccept 检查客户端是否能接受WebP
|
||
func (this *WebPImageConfig) MatchAccept(acceptContentTypes string) bool {
|
||
var t = "image/webp"
|
||
var index = strings.Index(acceptContentTypes, t)
|
||
if index < 0 {
|
||
return false
|
||
}
|
||
var l = len(acceptContentTypes)
|
||
if index > 0 && acceptContentTypes[index-1] != ',' {
|
||
return false
|
||
}
|
||
|
||
if index+len(t) < l && acceptContentTypes[index+len(t)] != ',' {
|
||
return false
|
||
}
|
||
return true
|
||
}
|