Skip to content

Commit 283363f

Browse files
authored
fix(metadata): trim responses before parsing (#547)
Fixes #540
1 parent 1d97017 commit 283363f

File tree

2 files changed

+51
-21
lines changed

2 files changed

+51
-21
lines changed

hcloud/metadata/client.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package metadata
22

33
import (
4+
"bytes"
45
"fmt"
56
"io"
67
"net"
@@ -80,16 +81,20 @@ func NewClient(options ...ClientOption) *Client {
8081
// get executes an HTTP request against the API.
8182
func (c *Client) get(path string) (string, error) {
8283
url := c.endpoint + path
84+
8385
resp, err := c.httpClient.Get(url)
8486
if err != nil {
8587
return "", err
8688
}
89+
8790
defer resp.Body.Close()
8891
bodyBytes, err := io.ReadAll(resp.Body)
8992
if err != nil {
9093
return "", err
9194
}
92-
body := string(bodyBytes)
95+
96+
body := string(bytes.TrimSpace(bodyBytes))
97+
9398
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
9499
return body, fmt.Errorf("response status was %d", resp.StatusCode)
95100
}

hcloud/metadata/client_test.go

+45-20
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"testing"
77

88
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
910
)
1011

1112
type testEnv struct {
@@ -39,6 +40,9 @@ func TestClient_Base(t *testing.T) {
3940
env.Mux.HandleFunc("/ok", func(w http.ResponseWriter, r *http.Request) {
4041
w.Write([]byte("ok"))
4142
})
43+
env.Mux.HandleFunc("/sanitized", func(w http.ResponseWriter, r *http.Request) {
44+
w.Write([]byte("sanitized \n"))
45+
})
4246
env.Mux.HandleFunc("/not-found", func(w http.ResponseWriter, r *http.Request) {
4347
w.WriteHeader(404)
4448
w.Write([]byte("not found"))
@@ -47,6 +51,9 @@ func TestClient_Base(t *testing.T) {
4751
if body, err := env.Client.get("/ok"); assert.NoError(t, err) {
4852
assert.Equal(t, "ok", body)
4953
}
54+
if body, err := env.Client.get("/sanitized"); assert.NoError(t, err) {
55+
assert.Equal(t, "sanitized", body)
56+
}
5057
if body, err := env.Client.get("/not-found"); assert.EqualError(t, err, "response status was 404") {
5158
assert.Equal(t, "not found", body)
5259
}
@@ -99,33 +106,51 @@ func TestClient_Hostname(t *testing.T) {
99106
}
100107

101108
func TestClient_InstanceID(t *testing.T) {
102-
env := newTestEnv()
103-
env.Mux.HandleFunc("/instance-id", func(w http.ResponseWriter, r *http.Request) {
104-
w.Write([]byte("123456"))
109+
t.Run("success", func(t *testing.T) {
110+
env := newTestEnv()
111+
env.Mux.HandleFunc("/instance-id", func(w http.ResponseWriter, r *http.Request) {
112+
w.Write([]byte("123456"))
113+
})
114+
115+
instanceID, err := env.Client.InstanceID()
116+
require.NoError(t, err)
117+
require.Equal(t, int64(123456), instanceID)
105118
})
106119

107-
instanceID, err := env.Client.InstanceID()
108-
if err != nil {
109-
t.Fatal(err)
110-
}
111-
if instanceID != 123456 {
112-
t.Fatalf("Unexpected instanceID %d", instanceID)
113-
}
120+
t.Run("success sanitized", func(t *testing.T) {
121+
env := newTestEnv()
122+
env.Mux.HandleFunc("/instance-id", func(w http.ResponseWriter, r *http.Request) {
123+
w.Write([]byte("123456\n"))
124+
})
125+
126+
instanceID, err := env.Client.InstanceID()
127+
require.NoError(t, err)
128+
require.Equal(t, int64(123456), instanceID)
129+
})
114130
}
115131

116132
func TestClient_PublicIPv4(t *testing.T) {
117-
env := newTestEnv()
118-
env.Mux.HandleFunc("/public-ipv4", func(w http.ResponseWriter, r *http.Request) {
119-
w.Write([]byte("127.0.0.1"))
133+
t.Run("success", func(t *testing.T) {
134+
env := newTestEnv()
135+
env.Mux.HandleFunc("/public-ipv4", func(w http.ResponseWriter, r *http.Request) {
136+
w.Write([]byte("127.0.0.1"))
137+
})
138+
139+
publicIPv4, err := env.Client.PublicIPv4()
140+
require.NoError(t, err)
141+
require.Equal(t, "127.0.0.1", publicIPv4.String())
120142
})
121143

122-
publicIPv4, err := env.Client.PublicIPv4()
123-
if err != nil {
124-
t.Fatal(err)
125-
}
126-
if publicIPv4.String() != "127.0.0.1" {
127-
t.Fatalf("Unexpected PublicIPv4 %s", publicIPv4.String())
128-
}
144+
t.Run("success sanitized", func(t *testing.T) {
145+
env := newTestEnv()
146+
env.Mux.HandleFunc("/public-ipv4", func(w http.ResponseWriter, r *http.Request) {
147+
w.Write([]byte("127.0.0.1\n"))
148+
})
149+
150+
publicIPv4, err := env.Client.PublicIPv4()
151+
require.NoError(t, err)
152+
require.Equal(t, "127.0.0.1", publicIPv4.String())
153+
})
129154
}
130155

131156
func TestClient_Region(t *testing.T) {

0 commit comments

Comments
 (0)