89 lines
2.1 KiB
Go
89 lines
2.1 KiB
Go
|
package measurex
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"net"
|
||
|
"net/url"
|
||
|
)
|
||
|
|
||
|
//
|
||
|
// Utils
|
||
|
//
|
||
|
// This is where we put free functions.
|
||
|
//
|
||
|
|
||
|
// ALPNForHTTPEndpoint selects the correct ALPN for an HTTP endpoint
|
||
|
// given the network. On failure, we return a nil list.
|
||
|
func ALPNForHTTPEndpoint(network EndpointNetwork) []string {
|
||
|
switch network {
|
||
|
case NetworkQUIC:
|
||
|
return []string{"h3"}
|
||
|
case NetworkTCP:
|
||
|
return []string{"h2", "http/1.1"}
|
||
|
default:
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// addrStringIfNotNil returns the string of the given addr
|
||
|
// unless the addr is nil, in which case it returns an empty string.
|
||
|
func addrStringIfNotNil(addr net.Addr) (out string) {
|
||
|
if addr != nil {
|
||
|
out = addr.String()
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// ErrCannotDeterminePortFromURL indicates that we could not determine
|
||
|
// the correct port from the URL authority and scheme.
|
||
|
var ErrCannotDeterminePortFromURL = errors.New("cannot determine port from URL")
|
||
|
|
||
|
// PortFromURL returns the port determined from the URL or an error.
|
||
|
func PortFromURL(URL *url.URL) (string, error) {
|
||
|
switch {
|
||
|
case URL.Port() != "":
|
||
|
return URL.Port(), nil
|
||
|
case URL.Scheme == "https":
|
||
|
return "443", nil
|
||
|
case URL.Scheme == "http":
|
||
|
return "80", nil
|
||
|
default:
|
||
|
return "", ErrCannotDeterminePortFromURL
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// removeDuplicateEndpoints removes duplicate endpoints from a list of endpoints.
|
||
|
func removeDuplicateEndpoints(epnts ...*Endpoint) (out []*Endpoint) {
|
||
|
duplicates := make(map[string]*Endpoint)
|
||
|
for _, epnt := range epnts {
|
||
|
duplicates[epnt.String()] = epnt
|
||
|
}
|
||
|
for _, epnt := range duplicates {
|
||
|
out = append(out, epnt)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// removeDuplicateHTTPEndpoints removes duplicate endpoints from a list of endpoints.
|
||
|
func removeDuplicateHTTPEndpoints(epnts ...*HTTPEndpoint) (out []*HTTPEndpoint) {
|
||
|
duplicates := make(map[string]*HTTPEndpoint)
|
||
|
for _, epnt := range epnts {
|
||
|
duplicates[epnt.String()] = epnt
|
||
|
}
|
||
|
for _, epnt := range duplicates {
|
||
|
out = append(out, epnt)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// HTTPEndpointsToEndpoints convers HTTPEndpoints to Endpoints
|
||
|
func HTTPEndpointsToEndpoints(in []*HTTPEndpoint) (out []*Endpoint) {
|
||
|
for _, epnt := range in {
|
||
|
out = append(out, &Endpoint{
|
||
|
Network: epnt.Network,
|
||
|
Address: epnt.Address,
|
||
|
})
|
||
|
}
|
||
|
return
|
||
|
}
|