mirror of
				https://github.com/TeaOSLab/EdgeCommon.git
				synced 2025-11-04 05:00:24 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			114 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package serverconfigs
 | 
						||
 | 
						||
import (
 | 
						||
	"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
 | 
						||
	"github.com/iwind/TeaGo/rands"
 | 
						||
	"github.com/iwind/TeaGo/types"
 | 
						||
	"regexp"
 | 
						||
	"strconv"
 | 
						||
	"strings"
 | 
						||
)
 | 
						||
 | 
						||
var regexpSinglePort = regexp.MustCompile(`^\d+$`)
 | 
						||
 | 
						||
// NetworkAddressConfig 网络地址配置
 | 
						||
type NetworkAddressConfig struct {
 | 
						||
	Protocol  Protocol `yaml:"protocol" json:"protocol"`   // 协议,http、tcp、tcp4、tcp6、unix、udp等
 | 
						||
	Host      string   `yaml:"host" json:"host"`           // 主机地址或主机名,支持变量
 | 
						||
	PortRange string   `yaml:"portRange" json:"portRange"` // 端口范围,支持 8080、8080-8090、8080:8090
 | 
						||
 | 
						||
	MinPort int `yaml:"minPort" json:"minPort"` // minPort和maxPort只是用来记录PortRange分解后的结果,不需要用户输入
 | 
						||
	MaxPort int `yaml:"maxPort" json:"maxPort"`
 | 
						||
 | 
						||
	hostHasVariables bool
 | 
						||
}
 | 
						||
 | 
						||
// Init 初始化
 | 
						||
func (this *NetworkAddressConfig) Init() error {
 | 
						||
	this.hostHasVariables = configutils.HasVariables(this.Host)
 | 
						||
 | 
						||
	// 特殊端口自动修复,防止有些小白用户不了解HTTP和HTTPS的区别而选择了错误的协议
 | 
						||
	if this.PortRange == "80" && this.Protocol == ProtocolHTTPS {
 | 
						||
		this.Protocol = ProtocolHTTP
 | 
						||
	}
 | 
						||
	if this.PortRange == "443" && this.Protocol == ProtocolHTTP {
 | 
						||
		this.Protocol = ProtocolHTTPS
 | 
						||
	}
 | 
						||
 | 
						||
	// 8080
 | 
						||
	if regexpSinglePort.MatchString(this.PortRange) {
 | 
						||
		this.MinPort = types.Int(this.PortRange)
 | 
						||
		this.MaxPort = this.MinPort
 | 
						||
		return nil
 | 
						||
	}
 | 
						||
 | 
						||
	// 8080:8090
 | 
						||
	if strings.Contains(this.PortRange, ":") {
 | 
						||
		pieces := strings.SplitN(this.PortRange, ":", 2)
 | 
						||
		minPort := types.Int(pieces[0])
 | 
						||
		maxPort := types.Int(pieces[1])
 | 
						||
		if minPort > maxPort {
 | 
						||
			minPort, maxPort = maxPort, minPort
 | 
						||
		}
 | 
						||
		this.MinPort = minPort
 | 
						||
		this.MaxPort = maxPort
 | 
						||
		return nil
 | 
						||
	}
 | 
						||
 | 
						||
	// 8080-8090
 | 
						||
	if strings.Contains(this.PortRange, "-") {
 | 
						||
		pieces := strings.SplitN(this.PortRange, "-", 2)
 | 
						||
		minPort := types.Int(pieces[0])
 | 
						||
		maxPort := types.Int(pieces[1])
 | 
						||
		if minPort > maxPort {
 | 
						||
			minPort, maxPort = maxPort, minPort
 | 
						||
		}
 | 
						||
		this.MinPort = minPort
 | 
						||
		this.MaxPort = maxPort
 | 
						||
		return nil
 | 
						||
	}
 | 
						||
 | 
						||
	return nil
 | 
						||
}
 | 
						||
 | 
						||
// Addresses 所有的地址列表,不包括scheme
 | 
						||
func (this *NetworkAddressConfig) Addresses() []string {
 | 
						||
	if this.Protocol == ProtocolUnix {
 | 
						||
		return []string{this.Host}
 | 
						||
	}
 | 
						||
 | 
						||
	result := []string{}
 | 
						||
	for i := this.MinPort; i <= this.MaxPort; i++ {
 | 
						||
		host := this.Host
 | 
						||
		result = append(result, configutils.QuoteIP(host)+":"+strconv.Itoa(i))
 | 
						||
	}
 | 
						||
	return result
 | 
						||
}
 | 
						||
 | 
						||
// FullAddresses 所有的地址列表,包含scheme
 | 
						||
func (this *NetworkAddressConfig) FullAddresses() []string {
 | 
						||
	if this.Protocol == ProtocolUnix {
 | 
						||
		return []string{this.Protocol.String() + ":" + this.Host}
 | 
						||
	}
 | 
						||
 | 
						||
	result := []string{}
 | 
						||
	for i := this.MinPort; i <= this.MaxPort; i++ {
 | 
						||
		host := this.Host
 | 
						||
		result = append(result, this.Protocol.String()+"://"+configutils.QuoteIP(host)+":"+strconv.Itoa(i))
 | 
						||
	}
 | 
						||
	return result
 | 
						||
}
 | 
						||
 | 
						||
// PickAddress 选择其中一个地址
 | 
						||
func (this *NetworkAddressConfig) PickAddress() string {
 | 
						||
	if this.MaxPort > this.MinPort {
 | 
						||
		return configutils.QuoteIP(this.Host) + ":" + strconv.Itoa(rands.Int(this.MinPort, this.MaxPort))
 | 
						||
	}
 | 
						||
	return configutils.QuoteIP(this.Host) + ":" + strconv.Itoa(this.MinPort)
 | 
						||
}
 | 
						||
 | 
						||
// HostHasVariables 判断Host是否包含变量
 | 
						||
func (this *NetworkAddressConfig) HostHasVariables() bool {
 | 
						||
	return this.hostHasVariables
 | 
						||
}
 |