Files
EdgeCommon/pkg/serverconfigs/origin_config.go

176 lines
5.1 KiB
Go
Raw Normal View History

2020-09-13 19:27:47 +08:00
package serverconfigs
import (
"fmt"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs"
"strconv"
"strings"
"time"
)
// 源站服务配置
2020-09-21 20:21:20 +08:00
type OriginConfig struct {
2020-09-13 19:27:47 +08:00
Id int64 `yaml:"id" json:"id"` // ID
IsOn bool `yaml:"isOn" json:"isOn"` // 是否启用 TODO
Version int `yaml:"version" json:"version"` // 版本
Name string `yaml:"name" json:"name"` // 名称 TODO
Addr *NetworkAddressConfig `yaml:"addr" json:"addr"` // 地址
Description string `yaml:"description" json:"description"` // 描述 TODO
Code string `yaml:"code" json:"code"` // 代号 TODO
2020-09-16 09:09:31 +08:00
Weight uint `yaml:"weight" json:"weight"` // 权重 TODO
ConnTimeout *shared.TimeDuration `yaml:"failTimeout" json:"failTimeout"` // 连接失败超时 TODO
ReadTimeout *shared.TimeDuration `yaml:"readTimeout" json:"readTimeout"` // 读取超时时间 TODO
IdleTimeout *shared.TimeDuration `yaml:"idleTimeout" json:"idleTimeout"` // 空闲连接超时时间 TODO
MaxFails int `yaml:"maxFails" json:"maxFails"` // 最多失败次数 TODO
MaxConns int `yaml:"maxConns" json:"maxConns"` // 最大并发连接数 TODO
MaxIdleConns int `yaml:"idleConns" json:"idleConns"` // 最大空闲连接数 TODO
2020-09-13 19:27:47 +08:00
RequestURI string `yaml:"requestURI" json:"requestURI"` // 转发后的请求URI TODO
Host string `yaml:"host" json:"host"` // 自定义主机名 TODO
2020-09-26 08:07:24 +08:00
RequestHeaderPolicyRef *shared.HTTPHeaderPolicyRef `yaml:"requestHeaderPolicyRef" json:"requestHeaderPolicyRef"` // 请求Header
RequestHeaderPolicy *shared.HTTPHeaderPolicy `yaml:"requestHeaderPolicy" json:"requestHeaderPolicy"` // 请求Header策略
ResponseHeaderPolicyRef *shared.HTTPHeaderPolicyRef `yaml:"responseHeaderPolicyRef" json:"responseHeaderPolicyRef"` // 响应Header`
ResponseHeaderPolicy *shared.HTTPHeaderPolicy `yaml:"responseHeaderPolicy" json:"responseHeaderPolicy"` // 响应Header策略
2020-09-13 19:27:47 +08:00
// 健康检查URL目前支持
// - http|https 返回2xx-3xx认为成功
HealthCheck *HealthCheckConfig `yaml:"healthCheck" json:"healthCheck"`
Cert *sslconfigs.SSLCertConfig `yaml:"cert" json:"cert"` // 请求源服务器用的证书
// ftp
2020-09-21 20:21:20 +08:00
FTP *OriginFTPConfig `yaml:"ftp" json:"ftp"`
2020-09-13 19:27:47 +08:00
connTimeoutDuration time.Duration
readTimeoutDuration time.Duration
idleTimeoutDuration time.Duration
hasRequestURI bool
requestPath string
requestArgs string
hasRequestHeaders bool
hasResponseHeaders bool
hasHost bool
uniqueKey string
hasAddrVariables bool // 地址中是否含有变量
2020-09-26 08:07:24 +08:00
realAddr string // 最终的Addr TODO
2020-09-13 19:27:47 +08:00
}
// 校验
2020-09-21 20:21:20 +08:00
func (this *OriginConfig) Init() error {
2020-09-13 19:27:47 +08:00
// 证书
if this.Cert != nil {
err := this.Cert.Init()
if err != nil {
return err
}
}
// unique key
this.uniqueKey = strconv.FormatInt(this.Id, 10) + "@" + fmt.Sprintf("%d", this.Version)
// failTimeout
2020-09-26 08:07:24 +08:00
if this.ConnTimeout != nil {
this.connTimeoutDuration = this.ConnTimeout.Duration()
}
2020-09-13 19:27:47 +08:00
// readTimeout
2020-09-26 08:07:24 +08:00
if this.ReadTimeout != nil {
this.readTimeoutDuration = this.ReadTimeout.Duration()
}
2020-09-13 19:27:47 +08:00
// idleTimeout
2020-09-26 08:07:24 +08:00
if this.IdleTimeout != nil {
this.idleTimeoutDuration = this.IdleTimeout.Duration()
}
2020-09-13 19:27:47 +08:00
// Headers
2020-09-26 19:54:20 +08:00
if this.RequestHeaderPolicyRef != nil {
err := this.RequestHeaderPolicyRef.Init()
if err != nil {
return err
}
}
2020-09-26 08:07:24 +08:00
if this.RequestHeaderPolicy != nil {
err := this.RequestHeaderPolicy.Init()
2020-09-13 19:27:47 +08:00
if err != nil {
return err
}
}
2020-09-26 19:54:20 +08:00
if this.ResponseHeaderPolicyRef != nil {
err := this.ResponseHeaderPolicyRef.Init()
if err != nil {
return err
}
}
2020-09-26 08:07:24 +08:00
if this.ResponseHeaderPolicy != nil {
err := this.ResponseHeaderPolicy.Init()
2020-09-13 19:27:47 +08:00
if err != nil {
return err
}
}
// request uri
if len(this.RequestURI) == 0 || this.RequestURI == "${requestURI}" {
this.hasRequestURI = false
} else {
this.hasRequestURI = true
if strings.Contains(this.RequestURI, "?") {
pieces := strings.SplitN(this.RequestURI, "?", -1)
this.requestPath = pieces[0]
this.requestArgs = pieces[1]
} else {
this.requestPath = this.RequestURI
}
}
// TODO init health check
// host
this.hasHost = len(this.Host) > 0
// variables
// TODO 在host和port中支持变量
this.hasAddrVariables = false
return nil
}
// 候选对象代号
2020-09-21 20:21:20 +08:00
func (this *OriginConfig) CandidateCodes() []string {
2020-09-13 19:27:47 +08:00
codes := []string{strconv.FormatInt(this.Id, 10)}
if len(this.Code) > 0 {
codes = append(codes, this.Code)
}
return codes
}
// 候选对象权重
2020-09-21 20:21:20 +08:00
func (this *OriginConfig) CandidateWeight() uint {
2020-09-13 19:27:47 +08:00
return this.Weight
}
2020-09-26 08:07:24 +08:00
// 获取最终请求的地址
func (this *OriginConfig) RealAddr() string {
return this.realAddr
}
// 设置最终请求的地址 TODO 需要实现
func (this *OriginConfig) SetRealAddr(realAddr string) {
this.realAddr = realAddr
}
2020-09-26 19:54:20 +08:00
// 连接超时时间
func (this *OriginConfig) ConnTimeoutDuration() time.Duration {
return this.connTimeoutDuration
}