Skip to content

Commit 3930549

Browse files
authored
resolver: replace resolver.Target.Endpoint field with Endpoint() method (#5852)
Fixes #5796
1 parent 894816c commit 3930549

File tree

14 files changed

+114
-107
lines changed

14 files changed

+114
-107
lines changed

balancer/grpclb/grpclb.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ func (b *lbBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) bal
136136

137137
lb := &lbBalancer{
138138
cc: newLBCacheClientConn(cc),
139-
dialTarget: opt.Target.Endpoint,
140-
target: opt.Target.Endpoint,
139+
dialTarget: opt.Target.Endpoint(),
140+
target: opt.Target.Endpoint(),
141141
opt: opt,
142142
fallbackTimeout: b.fallbackTimeout,
143143
doneCh: make(chan struct{}),

balancer/rls/balancer.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ func (b *rlsBalancer) sendNewPickerLocked() {
481481
}
482482
picker := &rlsPicker{
483483
kbm: b.lbCfg.kbMap,
484-
origEndpoint: b.bopts.Target.Endpoint,
484+
origEndpoint: b.bopts.Target.Endpoint(),
485485
lb: b,
486486
defaultPolicy: b.defaultPolicy,
487487
ctrlCh: b.ctrlCh,

clientconn.go

+3-16
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
256256
if err != nil {
257257
return nil, err
258258
}
259-
cc.authority, err = determineAuthority(cc.parsedTarget.Endpoint, cc.target, cc.dopts)
259+
cc.authority, err = determineAuthority(cc.parsedTarget.Endpoint(), cc.target, cc.dopts)
260260
if err != nil {
261261
return nil, err
262262
}
@@ -1587,30 +1587,17 @@ func (cc *ClientConn) parseTargetAndFindResolver() (resolver.Builder, error) {
15871587
}
15881588

15891589
// parseTarget uses RFC 3986 semantics to parse the given target into a
1590-
// resolver.Target struct containing scheme, authority and endpoint. Query
1590+
// resolver.Target struct containing scheme, authority and url. Query
15911591
// params are stripped from the endpoint.
15921592
func parseTarget(target string) (resolver.Target, error) {
15931593
u, err := url.Parse(target)
15941594
if err != nil {
15951595
return resolver.Target{}, err
15961596
}
1597-
// For targets of the form "[scheme]://[authority]/endpoint, the endpoint
1598-
// value returned from url.Parse() contains a leading "/". Although this is
1599-
// in accordance with RFC 3986, we do not want to break existing resolver
1600-
// implementations which expect the endpoint without the leading "/". So, we
1601-
// end up stripping the leading "/" here. But this will result in an
1602-
// incorrect parsing for something like "unix:///path/to/socket". Since we
1603-
// own the "unix" resolver, we can workaround in the unix resolver by using
1604-
// the `URL` field instead of the `Endpoint` field.
1605-
endpoint := u.Path
1606-
if endpoint == "" {
1607-
endpoint = u.Opaque
1608-
}
1609-
endpoint = strings.TrimPrefix(endpoint, "/")
1597+
16101598
return resolver.Target{
16111599
Scheme: u.Scheme,
16121600
Authority: u.Host,
1613-
Endpoint: endpoint,
16141601
URL: *u,
16151602
}, nil
16161603
}

clientconn_parsed_target_test.go

+46-44
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,15 @@ package grpc
2121
import (
2222
"context"
2323
"errors"
24+
"fmt"
2425
"net"
2526
"net/url"
2627
"testing"
2728
"time"
2829

2930
"github.com/google/go-cmp/cmp"
3031
"google.golang.org/grpc/credentials/insecure"
32+
"google.golang.org/grpc/internal/testutils"
3133

3234
"google.golang.org/grpc/resolver"
3335
)
@@ -40,46 +42,46 @@ func (s) TestParsedTarget_Success_WithoutCustomDialer(t *testing.T) {
4042
wantParsed resolver.Target
4143
}{
4244
// No scheme is specified.
43-
{target: "://", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "://"}},
44-
{target: ":///", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: ":///"}},
45-
{target: "://a/", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "://a/"}},
46-
{target: ":///a", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: ":///a"}},
47-
{target: "://a/b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "://a/b"}},
48-
{target: "/", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "/"}},
49-
{target: "a/b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "a/b"}},
50-
{target: "a//b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "a//b"}},
51-
{target: "google.com", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "google.com"}},
52-
{target: "google.com/?a=b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "google.com/"}},
53-
{target: "/unix/socket/address", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "/unix/socket/address"}},
45+
{target: "://", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "://"))}},
46+
{target: ":///", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, ":///"))}},
47+
{target: "://a/", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "://a/"))}},
48+
{target: ":///a", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, ":///a"))}},
49+
{target: "://a/b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "://a/b"))}},
50+
{target: "/", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "/"))}},
51+
{target: "a/b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "a/b"))}},
52+
{target: "a//b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "a//b"))}},
53+
{target: "google.com", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "google.com"))}},
54+
{target: "google.com/?a=b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "google.com/?a=b"))}},
55+
{target: "/unix/socket/address", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "/unix/socket/address"))}},
5456

5557
// An unregistered scheme is specified.
56-
{target: "a:///", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "a:///"}},
57-
{target: "a://b/", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "a://b/"}},
58-
{target: "a:///b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "a:///b"}},
59-
{target: "a://b/c", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "a://b/c"}},
60-
{target: "a:b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "a:b"}},
61-
{target: "a:/b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "a:/b"}},
62-
{target: "a://b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "a://b"}},
58+
{target: "a:///", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "a:///"))}},
59+
{target: "a://b/", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "a://b/"))}},
60+
{target: "a:///b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "a:///b"))}},
61+
{target: "a://b/c", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "a://b/c"))}},
62+
{target: "a:b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "a:b"))}},
63+
{target: "a:/b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "a:/b"))}},
64+
{target: "a://b", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "a://b"))}},
6365

6466
// A registered scheme is specified.
65-
{target: "dns:///google.com", wantParsed: resolver.Target{Scheme: "dns", Authority: "", Endpoint: "google.com"}},
66-
{target: "dns://a.server.com/google.com", wantParsed: resolver.Target{Scheme: "dns", Authority: "a.server.com", Endpoint: "google.com"}},
67-
{target: "dns://a.server.com/google.com/?a=b", wantParsed: resolver.Target{Scheme: "dns", Authority: "a.server.com", Endpoint: "google.com/"}},
68-
{target: "unix:///a/b/c", wantParsed: resolver.Target{Scheme: "unix", Authority: "", Endpoint: "a/b/c"}},
69-
{target: "unix-abstract:a/b/c", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "a/b/c"}},
70-
{target: "unix-abstract:a b", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "a b"}},
71-
{target: "unix-abstract:a:b", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "a:b"}},
72-
{target: "unix-abstract:a-b", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "a-b"}},
73-
{target: "unix-abstract:/ a///://::!@#$%25^&*()b", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: " a///://::!@"}},
74-
{target: "unix-abstract:passthrough:abc", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "passthrough:abc"}},
75-
{target: "unix-abstract:unix:///abc", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "unix:///abc"}},
76-
{target: "unix-abstract:///a/b/c", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "a/b/c"}},
77-
{target: "unix-abstract:///", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: ""}},
78-
{target: "passthrough:///unix:///a/b/c", wantParsed: resolver.Target{Scheme: "passthrough", Authority: "", Endpoint: "unix:///a/b/c"}},
67+
{target: "dns:///google.com", wantParsed: resolver.Target{Scheme: "dns", Authority: "", URL: *testutils.MustParseURL("dns:///google.com")}},
68+
{target: "dns://a.server.com/google.com", wantParsed: resolver.Target{Scheme: "dns", Authority: "a.server.com", URL: *testutils.MustParseURL("dns://a.server.com/google.com")}},
69+
{target: "dns://a.server.com/google.com/?a=b", wantParsed: resolver.Target{Scheme: "dns", Authority: "a.server.com", URL: *testutils.MustParseURL("dns://a.server.com/google.com/?a=b")}},
70+
{target: "unix:///a/b/c", wantParsed: resolver.Target{Scheme: "unix", Authority: "", URL: *testutils.MustParseURL("unix:///a/b/c")}},
71+
{target: "unix-abstract:a/b/c", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", URL: *testutils.MustParseURL("unix-abstract:a/b/c")}},
72+
{target: "unix-abstract:a b", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", URL: *testutils.MustParseURL("unix-abstract:a b")}},
73+
{target: "unix-abstract:a:b", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", URL: *testutils.MustParseURL("unix-abstract:a:b")}},
74+
{target: "unix-abstract:a-b", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", URL: *testutils.MustParseURL("unix-abstract:a-b")}},
75+
{target: "unix-abstract:/ a///://::!@#$%25^&*()b", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", URL: *testutils.MustParseURL("unix-abstract:/ a///://::!@#$%25^&*()b")}},
76+
{target: "unix-abstract:passthrough:abc", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", URL: *testutils.MustParseURL("unix-abstract:passthrough:abc")}},
77+
{target: "unix-abstract:unix:///abc", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", URL: *testutils.MustParseURL("unix-abstract:unix:///abc")}},
78+
{target: "unix-abstract:///a/b/c", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", URL: *testutils.MustParseURL("unix-abstract:///a/b/c")}},
79+
{target: "unix-abstract:///", wantParsed: resolver.Target{Scheme: "unix-abstract", Authority: "", URL: *testutils.MustParseURL("unix-abstract:///")}},
80+
{target: "passthrough:///unix:///a/b/c", wantParsed: resolver.Target{Scheme: "passthrough", Authority: "", URL: *testutils.MustParseURL("passthrough:///unix:///a/b/c")}},
7981

8082
// Cases for `scheme:absolute-path`.
81-
{target: "dns:/a/b/c", wantParsed: resolver.Target{Scheme: "dns", Authority: "", Endpoint: "a/b/c"}},
82-
{target: "unregistered:/a/b/c", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "unregistered:/a/b/c"}},
83+
{target: "dns:/a/b/c", wantParsed: resolver.Target{Scheme: "dns", Authority: "", URL: *testutils.MustParseURL("dns:/a/b/c")}},
84+
{target: "unregistered:/a/b/c", badScheme: true, wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL("unregistered:/a/b/c")}},
8385
}
8486

8587
for _, test := range tests {
@@ -138,56 +140,56 @@ func (s) TestParsedTarget_WithCustomDialer(t *testing.T) {
138140
// different behaviors with a custom dialer.
139141
{
140142
target: "unix:a/b/c",
141-
wantParsed: resolver.Target{Scheme: "unix", Authority: "", Endpoint: "a/b/c"},
143+
wantParsed: resolver.Target{Scheme: "unix", Authority: "", URL: *testutils.MustParseURL("unix:a/b/c")},
142144
wantDialerAddress: "unix:a/b/c",
143145
},
144146
{
145147
target: "unix:/a/b/c",
146-
wantParsed: resolver.Target{Scheme: "unix", Authority: "", Endpoint: "a/b/c"},
148+
wantParsed: resolver.Target{Scheme: "unix", Authority: "", URL: *testutils.MustParseURL("unix:/a/b/c")},
147149
wantDialerAddress: "unix:///a/b/c",
148150
},
149151
{
150152
target: "unix:///a/b/c",
151-
wantParsed: resolver.Target{Scheme: "unix", Authority: "", Endpoint: "a/b/c"},
153+
wantParsed: resolver.Target{Scheme: "unix", Authority: "", URL: *testutils.MustParseURL("unix:///a/b/c")},
152154
wantDialerAddress: "unix:///a/b/c",
153155
},
154156
{
155157
target: "dns:///127.0.0.1:50051",
156-
wantParsed: resolver.Target{Scheme: "dns", Authority: "", Endpoint: "127.0.0.1:50051"},
158+
wantParsed: resolver.Target{Scheme: "dns", Authority: "", URL: *testutils.MustParseURL("dns:///127.0.0.1:50051")},
157159
wantDialerAddress: "127.0.0.1:50051",
158160
},
159161
{
160162
target: ":///127.0.0.1:50051",
161163
badScheme: true,
162-
wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: ":///127.0.0.1:50051"},
164+
wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, ":///127.0.0.1:50051"))},
163165
wantDialerAddress: ":///127.0.0.1:50051",
164166
},
165167
{
166168
target: "dns://authority/127.0.0.1:50051",
167-
wantParsed: resolver.Target{Scheme: "dns", Authority: "authority", Endpoint: "127.0.0.1:50051"},
169+
wantParsed: resolver.Target{Scheme: "dns", Authority: "authority", URL: *testutils.MustParseURL("dns://authority/127.0.0.1:50051")},
168170
wantDialerAddress: "127.0.0.1:50051",
169171
},
170172
{
171173
target: "://authority/127.0.0.1:50051",
172174
badScheme: true,
173-
wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "://authority/127.0.0.1:50051"},
175+
wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "://authority/127.0.0.1:50051"))},
174176
wantDialerAddress: "://authority/127.0.0.1:50051",
175177
},
176178
{
177179
target: "/unix/socket/address",
178180
badScheme: true,
179-
wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: "/unix/socket/address"},
181+
wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, "/unix/socket/address"))},
180182
wantDialerAddress: "/unix/socket/address",
181183
},
182184
{
183185
target: "",
184186
badScheme: true,
185-
wantParsed: resolver.Target{Scheme: defScheme, Authority: "", Endpoint: ""},
187+
wantParsed: resolver.Target{Scheme: defScheme, Authority: "", URL: *testutils.MustParseURL(fmt.Sprintf("%s:///%s", defScheme, ""))},
186188
wantDialerAddress: "",
187189
},
188190
{
189191
target: "passthrough://a.server.com/google.com",
190-
wantParsed: resolver.Target{Scheme: "passthrough", Authority: "a.server.com", Endpoint: "google.com"},
192+
wantParsed: resolver.Target{Scheme: "passthrough", Authority: "a.server.com", URL: *testutils.MustParseURL("passthrough://a.server.com/google.com")},
191193
wantDialerAddress: "google.com",
192194
},
193195
}

examples/features/load_balancing/client/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ type exampleResolver struct {
111111
}
112112

113113
func (r *exampleResolver) start() {
114-
addrStrs := r.addrsStore[r.target.Endpoint]
114+
addrStrs := r.addrsStore[r.target.Endpoint()]
115115
addrs := make([]resolver.Address, len(addrStrs))
116116
for i, s := range addrStrs {
117117
addrs[i] = resolver.Address{Addr: s}

examples/features/name_resolving/client/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ type exampleResolver struct {
119119
}
120120

121121
func (r *exampleResolver) start() {
122-
addrStrs := r.addrsStore[r.target.Endpoint]
122+
addrStrs := r.addrsStore[r.target.Endpoint()]
123123
addrs := make([]resolver.Address, len(addrStrs))
124124
for i, s := range addrStrs {
125125
addrs[i] = resolver.Address{Addr: s}

internal/resolver/dns/dns_resolver.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ type dnsBuilder struct{}
116116

117117
// Build creates and starts a DNS resolver that watches the name resolution of the target.
118118
func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) {
119-
host, port, err := parseTarget(target.Endpoint, defaultPort)
119+
host, port, err := parseTarget(target.Endpoint(), defaultPort)
120120
if err != nil {
121121
return nil, err
122122
}

0 commit comments

Comments
 (0)