Files
deconnect/internal/domains/dialer/dial.go

69 lines
1.3 KiB
Go
Raw Permalink Normal View History

2026-05-26 16:32:55 +03:00
package dialer
import (
2026-05-27 10:58:13 +03:00
"context"
2026-05-26 16:32:55 +03:00
"crypto/tls"
2026-05-27 10:58:13 +03:00
"encoding/base64"
2026-05-26 16:32:55 +03:00
"fmt"
"net"
"net/url"
)
2026-05-27 10:58:13 +03:00
func (d *Dialer) Auth() (string, bool) {
url, _ := d.UpstreamURL()
if url.User == nil {
return "", false
2026-05-26 16:32:55 +03:00
}
2026-05-27 10:58:13 +03:00
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
2026-05-26 16:32:55 +03:00
}
func (d *Dialer) UpstreamURL() (*url.URL, error) {
if d.app.Config().Upstream.URL == "" {
return nil, fmt.Errorf(
2026-05-26 18:39:45 +03:00
"%w: %w (%s)", ErrDialer, ErrUpstreamURL,
2026-05-26 16:32:55 +03:00
"upstream URL is empty",
)
}
2026-05-27 10:58:13 +03:00
upstreamURL, err := url.Parse(d.app.Config().Upstream.URL)
2026-05-26 16:32:55 +03:00
if err != nil {
return nil, fmt.Errorf(
2026-05-26 18:39:45 +03:00
"%w: %w (%w)", ErrDialer, ErrUpstreamURL, err,
2026-05-26 16:32:55 +03:00
)
}
2026-05-27 10:58:13 +03:00
return upstreamURL, nil
2026-05-26 16:32:55 +03:00
}