diff --git a/clientconn.go b/clientconn.go index f6e815e6bfc..00934c38a14 100644 --- a/clientconn.go +++ b/clientconn.go @@ -883,14 +883,14 @@ func (cc *ClientConn) channelzMetric() *channelz.ChannelInternalMetric { } } -// Target returns the target string of the ClientConn. +// Target returns the canonical target string of the ClientConn. // // # Experimental // // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. func (cc *ClientConn) Target() string { - return cc.target + return cc.parsedTarget.String() } func (cc *ClientConn) incrCallsStarted() { @@ -1744,7 +1744,6 @@ func (cc *ClientConn) parseTargetAndFindResolver() error { defScheme := resolver.GetDefaultScheme() channelz.Infof(logger, cc.channelzID, "fallback to scheme %q", defScheme) canonicalTarget := defScheme + ":///" + cc.target - parsedTarget, err = parseTarget(canonicalTarget) if err != nil { channelz.Infof(logger, cc.channelzID, "dial target %q parse failed: %v", canonicalTarget, err) diff --git a/clientconn_test.go b/clientconn_test.go index eecea1b6d2c..96e2d8d028d 100644 --- a/clientconn_test.go +++ b/clientconn_test.go @@ -808,15 +808,44 @@ func (s) TestMethodConfigDefaultService(t *testing.T) { } } -func (s) TestGetClientConnTarget(t *testing.T) { - addr := "nonexist:///non.existent" - cc, err := Dial(addr, WithTransportCredentials(insecure.NewCredentials())) - if err != nil { - t.Fatalf("Dial(%s, _) = _, %v, want _, ", addr, err) +func (s) TestClientConn_Target(t *testing.T) { + tests := []struct { + name string + addr string + targetWant string + }{ + { + name: "normal-case", + addr: "dns://a.server.com/google.com", + targetWant: "dns://a.server.com/google.com", + }, + { + name: "canonical-target-not-specified", + addr: "no.scheme", + targetWant: "passthrough:///no.scheme", + }, + { + name: "canonical-target-nonexistent", + addr: "nonexist:///non.existent", + targetWant: "passthrough:///nonexist:///non.existent", + }, + { + name: "canonical-target-add-colon-slash", + addr: "dns:hostname:port", + targetWant: "dns:///hostname:port", + }, } - defer cc.Close() - if cc.Target() != addr { - t.Fatalf("Target() = %s, want %s", cc.Target(), addr) + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + cc, err := Dial(test.addr, WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + t.Fatalf("Dial(%s, _) = _, %v, want _, ", test.addr, err) + } + defer cc.Close() + if cc.Target() != test.targetWant { + t.Fatalf("Target() = %s, want %s", cc.Target(), test.targetWant) + } + }) } } diff --git a/resolver/resolver.go b/resolver/resolver.go index adf89dd9cfe..ca6dbd1e919 100644 --- a/resolver/resolver.go +++ b/resolver/resolver.go @@ -281,9 +281,9 @@ func (t Target) Endpoint() string { return strings.TrimPrefix(endpoint, "/") } -// String returns a string representation of Target. +// String returns the canonical string representation of Target. func (t Target) String() string { - return t.URL.String() + return t.URL.Scheme + "://" + t.URL.Host + "/" + t.Endpoint() } // Builder creates a resolver that will be used to watch name resolution updates.