package echo import ( "fmt" "net" "strconv" ) type AddressPortConfig struct { HttpPort int TlsPort int QuicPort int Addresses []string } func (c *AddressPortConfig) QuicBindings() []string { o := make([]string, len(c.Addresses)) for i, a := range c.Addresses { o[i] = net.JoinHostPort(a, strconv.Itoa(c.QuicPort)) } return o } func (c *AddressPortConfig) TlsBindings() []string { o := make([]string, len(c.Addresses)) for i, a := range c.Addresses { o[i] = net.JoinHostPort(a, strconv.Itoa(c.TlsPort)) } return o } func (c *AddressPortConfig) HttpBindings() []string { o := make([]string, len(c.Addresses)) for i, a := range c.Addresses { o[i] = net.JoinHostPort(a, strconv.Itoa(c.HttpPort)) } return o } func ParseAddressPortBindings(b []string) (*AddressPortConfig, error) { o := &AddressPortConfig{ Addresses: make([]string, len(b)), } for i, a := range b { host, port, err := net.SplitHostPort(a) if err != nil { return nil, fmt.Errorf("ParseAddressPortBindings: error splitting address: %w", err) } o.Addresses[i] = host intPort, err := strconv.Atoi(port) if err != nil { return nil, fmt.Errorf("ParseAddressPortBindings: error parsing port to string: %w", err) } if o.HttpPort == 0 { o.HttpPort = intPort } else { if o.HttpPort != intPort { return nil, fmt.Errorf("ParseAddressPortBindings: all ports must be the same number") } } } if o.HttpPort == 0 { return nil, fmt.Errorf("ParseAddressPortBindings: no valid HTTP port was specified") } o.TlsPort = o.HttpPort + 1 o.QuicPort = o.TlsPort return o, nil }