Changeset 352 in code for trunk/upstream.go


Ignore:
Timestamp:
Jul 6, 2020, 3:18:13 PM (5 years ago)
Author:
contact
Message:

Parse upstream URLs with net/url

This allows us to ignore the path part of the URL. This is preliminary
work for unix URLs.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/upstream.go

    r351 r352  
    1111        "io"
    1212        "net"
     13        "net/url"
    1314        "strconv"
    1415        "strings"
     
    8182        logger := &prefixLogger{network.user.srv.Logger, fmt.Sprintf("upstream %q: ", network.Addr)}
    8283
    83         var scheme string
    84         var addr string
    85 
    86         addrParts := strings.SplitN(network.Addr, "://", 2)
    87         if len(addrParts) == 2 {
    88                 scheme = addrParts[0]
    89                 addr = addrParts[1]
    90         } else {
    91                 scheme = "ircs"
    92                 addr = addrParts[0]
    93         }
    94 
    9584        dialer := net.Dialer{Timeout: connectTimeout}
    9685
     86        s := network.Addr
     87        if !strings.Contains(s, "://") {
     88                // This is a raw domain name, make it an URL with the default scheme
     89                s = "ircs://" + s
     90        }
     91
     92        u, err := url.Parse(s)
     93        if err != nil {
     94                return nil, fmt.Errorf("failed to parse upstream server URL: %v", err)
     95        }
     96
    9797        var netConn net.Conn
    98         var err error
    99         switch scheme {
     98        switch u.Scheme {
    10099        case "ircs":
     100                addr := u.Host
    101101                if _, _, err := net.SplitHostPort(addr); err != nil {
    102102                        addr = addr + ":6697"
     
    105105                logger.Printf("connecting to TLS server at address %q", addr)
    106106
    107                 var cfg *tls.Config
     107                var tlsConfig *tls.Config
    108108                if network.SASL.Mechanism == "EXTERNAL" {
    109109                        if network.SASL.External.CertBlob == nil {
     
    117117                                return nil, fmt.Errorf("failed to parse private key: %v", err)
    118118                        }
    119                         cfg = &tls.Config{
     119                        tlsConfig = &tls.Config{
    120120                                Certificates: []tls.Certificate{
    121121                                        {
     
    128128                }
    129129
    130                 netConn, err = tls.DialWithDialer(&dialer, "tcp", addr, cfg)
     130                netConn, err = tls.DialWithDialer(&dialer, "tcp", addr, tlsConfig)
     131                if err != nil {
     132                        return nil, fmt.Errorf("failed to dial %q: %v", addr, err)
     133                }
    131134        case "irc+insecure":
     135                addr := u.Host
    132136                if _, _, err := net.SplitHostPort(addr); err != nil {
    133137                        addr = addr + ":6667"
     
    136140                logger.Printf("connecting to plain-text server at address %q", addr)
    137141                netConn, err = dialer.Dial("tcp", addr)
     142                if err != nil {
     143                        return nil, fmt.Errorf("failed to dial %q: %v", addr, err)
     144                }
    138145        default:
    139                 return nil, fmt.Errorf("failed to dial %q: unknown scheme: %v", addr, scheme)
    140         }
    141         if err != nil {
    142                 return nil, fmt.Errorf("failed to dial %q: %v", addr, err)
     146                return nil, fmt.Errorf("failed to dial %q: unknown scheme: %v", network.Addr, u.Scheme)
    143147        }
    144148
     
    157161                messageLoggers:           make(map[string]*messageLogger),
    158162        }
    159 
    160163        return uc, nil
    161164}
Note: See TracChangeset for help on using the changeset viewer.