Skip to content

Commit 0d57c57

Browse files
authored
Fix parseTarget for unix socket address without scheme (grpc#1611)
1 parent b3ed81a commit 0d57c57

File tree

2 files changed

+44
-8
lines changed

2 files changed

+44
-8
lines changed

resolver_conn_wrapper.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,24 @@ type ccResolverWrapper struct {
3737
}
3838

3939
// split2 returns the values from strings.SplitN(s, sep, 2).
40-
// If sep is not found, it returns "", s instead.
41-
func split2(s, sep string) (string, string) {
40+
// If sep is not found, it returns ("", s, false) instead.
41+
func split2(s, sep string) (string, string, bool) {
4242
spl := strings.SplitN(s, sep, 2)
4343
if len(spl) < 2 {
44-
return "", s
44+
return "", "", false
4545
}
46-
return spl[0], spl[1]
46+
return spl[0], spl[1], true
4747
}
4848

4949
// parseTarget splits target into a struct containing scheme, authority and
5050
// endpoint.
5151
func parseTarget(target string) (ret resolver.Target) {
52-
ret.Scheme, ret.Endpoint = split2(target, "://")
53-
ret.Authority, ret.Endpoint = split2(ret.Endpoint, "/")
52+
var ok bool
53+
ret.Scheme, ret.Endpoint, ok = split2(target, "://")
54+
if !ok {
55+
return resolver.Target{Endpoint: target}
56+
}
57+
ret.Authority, ret.Endpoint, _ = split2(ret.Endpoint, "/")
5458
return ret
5559
}
5660

resolver_conn_wrapper_test.go

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,46 @@ func TestParseTarget(t *testing.T) {
3434
{"a", "", "b"},
3535
{"", "a", "b"},
3636
{"a", "b", "c"},
37-
{"dns", "a.server.com", "google.com"},
37+
{"dns", "", "google.com"},
3838
{"dns", "a.server.com", "google.com"},
3939
{"dns", "a.server.com", "google.com/?a=b"},
40+
{"", "", "/unix/socket/address"},
4041
} {
4142
str := test.Scheme + "://" + test.Authority + "/" + test.Endpoint
4243
got := parseTarget(str)
4344
if got != test {
44-
t.Errorf("parseTarget(%q) = %v, want %v", str, got, test)
45+
t.Errorf("parseTarget(%q) = %+v, want %+v", str, got, test)
46+
}
47+
}
48+
}
49+
50+
func TestParseTargetString(t *testing.T) {
51+
for _, test := range []struct {
52+
targetStr string
53+
want resolver.Target
54+
}{
55+
{"", resolver.Target{"", "", ""}},
56+
{"://", resolver.Target{"", "", ""}},
57+
{":///", resolver.Target{"", "", ""}},
58+
{"a:///", resolver.Target{"a", "", ""}},
59+
{"://a/", resolver.Target{"", "a", ""}},
60+
{":///a", resolver.Target{"", "", "a"}},
61+
{"a://b/", resolver.Target{"a", "b", ""}},
62+
{"a:///b", resolver.Target{"a", "", "b"}},
63+
{"://a/b", resolver.Target{"", "a", "b"}},
64+
{"a://b/c", resolver.Target{"a", "b", "c"}},
65+
{"dns:///google.com", resolver.Target{"dns", "", "google.com"}},
66+
{"dns://a.server.com/google.com", resolver.Target{"dns", "a.server.com", "google.com"}},
67+
{"dns://a.server.com/google.com/?a=b", resolver.Target{"dns", "a.server.com", "google.com/?a=b"}},
68+
69+
{"/", resolver.Target{"", "", "/"}},
70+
{"google.com", resolver.Target{"", "", "google.com"}},
71+
{"google.com/?a=b", resolver.Target{"", "", "google.com/?a=b"}},
72+
{"/unix/socket/address", resolver.Target{"", "", "/unix/socket/address"}},
73+
} {
74+
got := parseTarget(test.targetStr)
75+
if got != test.want {
76+
t.Errorf("parseTarget(%q) = %+v, want %+v", test.targetStr, got, test.want)
4577
}
4678
}
4779
}

0 commit comments

Comments
 (0)