package hopp import "net" import "errors" import "context" import "crypto/tls" // Dial opens a connection to a server. The network must be one of "quic", // "quic4", (IPv4-only) "quic6" (IPv6-only), or "unix". For now, "quic4" and // "quic6" don't do anything as the quic-go package doesn't seem to support this // behavior. func Dial(ctx context.Context, network, address string) (Conn, error) { return (Dialer { }).Dial(ctx, network, address) } // Dialer allows for further configuration of the dialing process. type Dialer struct { TLSConfig *tls.Config } // Dial opens a connection to a server. The network must be one of "quic", // "quic4", (IPv4-only) "quic6" (IPv6-only), or "unix". For now, "quic4" and // "quic6" don't do anything as the quic-go package doesn't seem to support this // behavior. func (diale Dialer) Dial(ctx context.Context, network, address string) (Conn, error) { switch network { case "quic", "quic4", "quic6": return diale.dialQUIC(ctx, network, address) case "unix": return diale.dialUnix(ctx, network, address) default: return nil, ErrUnknownNetwork } } func (diale Dialer) dialQUIC(ctx context.Context, network, address string) (Conn, error) { return nil, errors.New("quic is not yet implemented") } func (diale Dialer) dialUnix(ctx context.Context, network, address string) (Conn, error) { if network != "unix" { return nil, ErrUnknownNetwork } addr, err := net.ResolveUnixAddr(network, address) if err != nil { return nil, err } conn, err := net.DialUnix(network, nil, addr) if err != nil { return nil, err } return AdaptA(conn, ClientSide), nil } func tlsConfig(conf *tls.Config) *tls.Config { if conf == nil { conf = &tls.Config { } } else { conf = conf.Clone() } conf.NextProtos = []string { "HOPP/0", } return conf } func quicNetworkToUDPNetwork(network string) (string, error) { switch network { case "quic4": return "udp4", nil case "quic6": return "udp6", nil case "quic": return "udp", nil default: return "", ErrUnknownNetwork } }