69 lines
1.3 KiB
Go
69 lines
1.3 KiB
Go
package dialer
|
|
|
|
import (
|
|
"context"
|
|
"crypto/tls"
|
|
"encoding/base64"
|
|
"fmt"
|
|
"net"
|
|
"net/url"
|
|
)
|
|
|
|
func (d *Dialer) Auth() (string, bool) {
|
|
url, _ := d.UpstreamURL()
|
|
if url.User == nil {
|
|
return "", false
|
|
}
|
|
|
|
username := url.User.Username()
|
|
password, _ := url.User.Password()
|
|
|
|
return base64.StdEncoding.EncodeToString(
|
|
[]byte(username + ":" + password),
|
|
), true
|
|
}
|
|
|
|
func (d *Dialer) Dial(ctx context.Context) (net.Conn, error) {
|
|
dialer := &net.Dialer{}
|
|
|
|
conn, err := dialer.DialContext(ctx, "tcp", d.dialURL.Host)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%w: %w (%w)", ErrDialer, ErrDial, err)
|
|
}
|
|
|
|
if d.dialURL.Scheme != "https" {
|
|
return conn, nil
|
|
}
|
|
|
|
tlsConn := tls.Client(conn, &tls.Config{
|
|
ServerName: d.dialURL.Hostname(),
|
|
//nolint:gosec
|
|
InsecureSkipVerify: d.app.Config().Upstream.InsecureTLS,
|
|
})
|
|
if err := tlsConn.HandshakeContext(ctx); err != nil {
|
|
_ = conn.Close()
|
|
|
|
return nil, fmt.Errorf("%w: %w (%w)", ErrDialer, ErrDial, err)
|
|
}
|
|
|
|
return tlsConn, nil
|
|
}
|
|
|
|
func (d *Dialer) UpstreamURL() (*url.URL, error) {
|
|
if d.app.Config().Upstream.URL == "" {
|
|
return nil, fmt.Errorf(
|
|
"%w: %w (%s)", ErrDialer, ErrUpstreamURL,
|
|
"upstream URL is empty",
|
|
)
|
|
}
|
|
|
|
upstreamURL, err := url.Parse(d.app.Config().Upstream.URL)
|
|
if err != nil {
|
|
return nil, fmt.Errorf(
|
|
"%w: %w (%w)", ErrDialer, ErrUpstreamURL, err,
|
|
)
|
|
}
|
|
|
|
return upstreamURL, nil
|
|
}
|