Skip to content

Commit a35d49e

Browse files
authored
Correctly parses IPv6 addresses. (#130)
* Adds support for IPv6. * Alters unit test to make sure we're set up for IPv6
1 parent 453838c commit a35d49e

File tree

2 files changed

+46
-41
lines changed

2 files changed

+46
-41
lines changed

stackdriver/client.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"context"
1818
"crypto/tls"
1919
"fmt"
20+
"net"
2021
"net/url"
2122
"strconv"
2223
"sync"
@@ -122,7 +123,7 @@ func (c *Client) getConnection(ctx context.Context) (*grpc.ClientConn, error) {
122123
}
123124
address := c.url.Hostname()
124125
if len(c.url.Port()) > 0 {
125-
address = fmt.Sprintf("%s:%s", address, c.url.Port())
126+
address = net.JoinHostPort(address, c.url.Port())
126127
}
127128
if c.resolver != nil {
128129
address = c.resolver.Scheme() + ":///" + address

stackdriver/client_test.go

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -120,49 +120,53 @@ func TestEmptyRequest(t *testing.T) {
120120
}
121121

122122
func TestResolver(t *testing.T) {
123-
grpcServer := grpc.NewServer()
124-
listener := newLocalListener()
125-
monitoring.RegisterMetricServiceServer(grpcServer, &metricServiceServer{nil})
126-
go grpcServer.Serve(listener)
127-
defer grpcServer.Stop()
128-
129-
logBuffer := &bytes.Buffer{}
130-
defer func() {
131-
if logBuffer.Len() > 0 {
132-
t.Log(logBuffer.String())
133-
}
134-
}()
135-
logger := log.NewLogfmtLogger(logBuffer)
123+
addressesToTest := []string{"stackdriver.invalid", "2001:db8::"}
124+
for _, address := range addressesToTest {
125+
grpcServer := grpc.NewServer()
126+
listener := newLocalListener()
127+
monitoring.RegisterMetricServiceServer(grpcServer, &metricServiceServer{nil})
128+
go grpcServer.Serve(listener)
129+
defer grpcServer.Stop()
130+
131+
logBuffer := &bytes.Buffer{}
132+
defer func() {
133+
if logBuffer.Len() > 0 {
134+
t.Log(logBuffer.String())
135+
}
136+
}()
137+
logger := log.NewLogfmtLogger(logBuffer)
136138

137-
// Without ?auth=false, the test fails with context deadline exceeded.
138-
serverURL, err := url.Parse("http://stackdriver.invalid?auth=false")
139-
if err != nil {
140-
t.Fatal(err)
141-
}
139+
// Without ?auth=false, the test fails with context deadline exceeded.
140+
serverURL, err := url.Parse("http://" + address + "?auth=false")
141+
if err != nil {
142+
t.Fatal(err)
143+
}
142144

143-
res, _ := manual.GenerateAndRegisterManualResolver()
144-
res.InitialAddrs([]resolver.Address{
145-
{Addr: listener.Addr().String()},
146-
})
145+
res, _ := manual.GenerateAndRegisterManualResolver()
146+
res.InitialAddrs([]resolver.Address{
147+
{Addr: listener.Addr().String()},
148+
})
147149

148-
c := NewClient(&ClientConfig{
149-
URL: serverURL,
150-
Timeout: time.Second,
151-
Resolver: res,
152-
Logger: logger,
153-
})
150+
c := NewClient(&ClientConfig{
151+
URL: serverURL,
152+
Timeout: time.Second,
153+
Resolver: res,
154+
Logger: logger,
155+
})
154156

155-
err = c.Store(&monitoring.CreateTimeSeriesRequest{
156-
TimeSeries: []*monitoring.TimeSeries{
157-
&monitoring.TimeSeries{},
158-
},
159-
})
160-
if err != nil {
161-
t.Fatal(err)
162-
}
163-
requestedTarget := c.conn.Target()
164-
if requestedTarget != c.resolver.Scheme()+":///stackdriver.invalid" {
165-
t.Errorf("ERROR: Remote address is %s, want stackdriver.invalid.",
166-
requestedTarget)
157+
err = c.Store(&monitoring.CreateTimeSeriesRequest{
158+
TimeSeries: []*monitoring.TimeSeries{
159+
&monitoring.TimeSeries{},
160+
},
161+
})
162+
if err != nil {
163+
t.Fatal(err)
164+
}
165+
requestedTarget := c.conn.Target()
166+
expectedTarget := c.resolver.Scheme()+":///" + address
167+
if requestedTarget != expectedTarget {
168+
t.Errorf("ERROR: Remote address is %s, want " + expectedTarget,
169+
requestedTarget)
170+
}
167171
}
168172
}

0 commit comments

Comments
 (0)