Skip to content

Commit 8757d8a

Browse files
committed
Fixes parsing connect string when for e.g. pass contains "=" character
1 parent 5f695c3 commit 8757d8a

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

credentials.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ type credentials struct {
1010
maxPoolSize, lockTimeout int
1111
}
1212

13+
// NewCredentials fills credentials stusct from connection string
1314
func NewCredentials(connStr string) *credentials {
1415
parts := strings.Split(connStr, ";")
1516
crd := &credentials{maxPoolSize: 100}
1617
for _, part := range parts {
17-
kv := strings.Split(part, "=")
18+
kv := strings.SplitN(part, "=", 2)
1819
if len(kv) == 2 {
1920
key := strings.ToLower(strings.Trim(kv[0], " "))
2021
value := kv[1]

credentials_test.go

+22
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,25 @@ func TestParseConnectionStringCompatibilityMode(t *testing.T) {
5353
assert.Equal(t, expected, crd.compatibility)
5454
}
5555
}
56+
57+
// TestParseConnectionStringEqualsInValue tests parsing when for e.g. password contains "="
58+
func TestParseConnectionStringEqualsInValue(t *testing.T) {
59+
validConnStrings := []string{
60+
"Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=my=Password;Failover Partner=myMirror;Max Pool Size=200;Lock Timeout=1000",
61+
"Server=myServerAddress;Database=myDataBase;User_Id=myUsername;Password=my=Password;Failover_Partner=myMirror;Max_Pool_Size=200;Lock_Timeout=1000",
62+
"server=myServerAddress;database=myDataBase;user_id=myUsername;password=my=Password;failover_partner=myMirror;max_pool_size=200;lock_timeout=1000",
63+
"host=myServerAddress;database=myDataBase;user=myUsername;pwd=my=Password;mirror=myMirror;max_pool_size=200;lock_timeout=1000",
64+
"host=myServerAddress;database=myDataBase;user=myUsername;pwd=my=Password;mirror=myMirror;max_pool_size=200;lock_timeout=1000",
65+
}
66+
for _, connStr := range validConnStrings {
67+
crd := NewCredentials(connStr)
68+
assert.NotNil(t, crd)
69+
assert.Equal(t, "myServerAddress", crd.host)
70+
assert.Equal(t, "myDataBase", crd.database)
71+
assert.Equal(t, "myUsername", crd.user)
72+
assert.Equal(t, "my=Password", crd.pwd)
73+
assert.Equal(t, "myMirror", crd.mirrorHost)
74+
assert.Equal(t, 200, crd.maxPoolSize)
75+
assert.Equal(t, 1000, crd.lockTimeout)
76+
}
77+
}

0 commit comments

Comments
 (0)