51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
package edgediscovery
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
protocolRecord = "protocol-v2.argotunnel.com"
|
|
)
|
|
|
|
var (
|
|
errNoProtocolRecord = fmt.Errorf("No TXT record found for %s to determine connection protocol", protocolRecord)
|
|
)
|
|
|
|
// ProtocolPercent represents a single Protocol Percentage combination.
|
|
type ProtocolPercent struct {
|
|
Protocol string `json:"protocol"`
|
|
Percentage int32 `json:"percentage"`
|
|
}
|
|
|
|
// ProtocolPercents represents the preferred distribution ratio of protocols when protocol isn't specified.
|
|
type ProtocolPercents []ProtocolPercent
|
|
|
|
// GetPercentage returns the threshold percentage of a single protocol.
|
|
func (p ProtocolPercents) GetPercentage(protocol string) int32 {
|
|
for _, protocolPercent := range p {
|
|
if strings.ToLower(protocolPercent.Protocol) == strings.ToLower(protocol) {
|
|
return protocolPercent.Percentage
|
|
}
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// ProtocolPercentage returns the ratio of protocols and a specification ratio for their selection.
|
|
func ProtocolPercentage() (ProtocolPercents, error) {
|
|
records, err := net.LookupTXT(protocolRecord)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(records) == 0 {
|
|
return nil, errNoProtocolRecord
|
|
}
|
|
|
|
var protocolsWithPercent ProtocolPercents
|
|
err = json.Unmarshal([]byte(records[0]), &protocolsWithPercent)
|
|
return protocolsWithPercent, err
|
|
}
|