MSSQL: Add HostName method (#87309)

* Add HostName method

* Add test

* Fix lint
This commit is contained in:
Andreas Christou 2024-05-03 15:45:34 +01:00 committed by GitHub
parent ac8f3f6e86
commit 28df41fd96
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 40 additions and 3 deletions

View File

@ -14,6 +14,10 @@ type HostTransportDialer struct {
Host string
}
func (m HostTransportDialer) HostName() string {
return m.Host
}
func (m HostTransportDialer) DialContext(ctx context.Context, network string, addr string) (conn net.Conn, err error) {
return m.Dialer.DialContext(ctx, network, addr)
}

View File

@ -13,6 +13,7 @@ import (
)
type testDialer struct {
Host string
}
func (d *testDialer) Dial(network, addr string) (c net.Conn, err error) {
@ -20,18 +21,50 @@ func (d *testDialer) Dial(network, addr string) (c net.Conn, err error) {
}
func (d *testDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
hostWithPort := d.HostName() + ":1433"
if address != hostWithPort {
return nil, fmt.Errorf("test-dialer: address does not match hostname")
}
return nil, fmt.Errorf("test-dialer: DialContext is not functional")
}
func (d *testDialer) HostName() string {
return d.Host
}
var _ proxy.Dialer = (&testDialer{})
func TestMSSQLProxyDriver(t *testing.T) {
cnnstr := "server=127.0.0.1;port=1433;user id=sa;password=yourStrong(!)Password;database=db"
t.Run("Connector should use dialer context that routes through the socks proxy to db", func(t *testing.T) {
host := "127.0.0.1"
cnnstr := fmt.Sprintf("server=%s;port=1433;user id=sa;password=yourStrong(!)Password;database=db", host)
connector, err := mssql.NewConnector(cnnstr)
require.NoError(t, err)
dialer, err := newMSSQLProxyDialer("127.0.0.1", &testDialer{})
td := testDialer{
Host: host,
}
dialer, err := newMSSQLProxyDialer("%s", &td)
require.NoError(t, err)
connector.Dialer = (dialer)
db := sql.OpenDB(connector)
err = db.Ping()
require.Contains(t, err.Error(), "test-dialer: DialContext is not functional")
})
t.Run("Connector should use hostname rather than attempting to resolve IP", func(t *testing.T) {
host := "www.grafana.com"
cnnstr := fmt.Sprintf("server=%s;port=1433;user id=sa;password=yourStrong(!)Password;database=db", host)
connector, err := mssql.NewConnector(cnnstr)
require.NoError(t, err)
td := testDialer{
Host: host,
}
dialer, err := newMSSQLProxyDialer(host, &td)
require.NoError(t, err)
connector.Dialer = (dialer)