Skip to content

Commit 4d778a5

Browse files
committed
test(http): replace external httpbin.org with local test server for header tests
Gavel-Issue-Id: 2a55fc284b25da73528b29fa26876212 Claude-Session-Id: c6e82086-2045-406c-87b9-b03ac8b55bf1
1 parent 33419da commit 4d778a5

1 file changed

Lines changed: 46 additions & 29 deletions

File tree

http/http_test.go

Lines changed: 46 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ package http_test
22

33
import (
44
"context"
5+
"encoding/json"
56
"fmt"
67
"net"
78
netHTTP "net/http"
8-
"net/url"
9+
"net/http/httptest"
10+
"strings"
911
"testing"
1012
"time"
1113

@@ -146,53 +148,48 @@ func TestHTTP(t *testing.T) {
146148
})
147149

148150
t.Run("Host Header", func(t *testing.T) {
149-
uri, _ := url.Parse("https://httpbin.org/headers")
150-
ips, err := net.LookupIP(uri.Host)
151-
if err != nil {
152-
t.Error(err.Error())
153-
}
154-
155-
uriIP := *uri
156-
uriIP.Host = ips[0].To4().String()
151+
server := startHeadersServer(t)
157152

153+
const hostOverride = "httpbin.example.com"
158154
resp, err := http.NewClient().
159155
TraceToStdout(http.TraceAll).
160-
InsecureSkipVerify(true).
161156
R(context.Background()).
162-
Header("Host", uri.Host).
163-
Get(uriIP.String())
157+
Header("Host", hostOverride).
158+
Get(server.URL + "/headers")
164159
if err != nil {
165-
t.Error(err)
160+
t.Fatal(err)
166161
}
167162

168-
var headers map[string]any
169-
if body, err := resp.AsJSON(); err != nil {
170-
t.Error(err)
171-
} else {
172-
headers = body["headers"].(map[string]any)
163+
body, err := resp.AsJSON()
164+
if err != nil {
165+
t.Fatal(err)
173166
}
167+
headers := body["headers"].(map[string]any)
174168

175-
if headers["Host"] != uri.Host {
176-
t.Errorf("Expected response headers %s", headers)
169+
if headers["Host"] != hostOverride {
170+
t.Errorf("expected Host header %q, got %v", hostOverride, headers["Host"])
177171
}
178172
})
179173

180174
t.Run("No Auth", func(t *testing.T) {
181-
resp, err := http.NewClient().R(context.Background()).Header("Hello", "World").Get("https://httpbin.org/headers")
175+
server := startHeadersServer(t)
176+
177+
resp, err := http.NewClient().R(context.Background()).Header("Hello", "World").Get(server.URL + "/headers")
182178
if err != nil {
183-
t.Error(err)
179+
t.Fatal(err)
184180
}
185-
var headers map[string]any
186-
if body, err := resp.AsJSON(); err != nil {
187-
t.Error(err)
188-
} else {
189-
headers = body["headers"].(map[string]any)
181+
182+
body, err := resp.AsJSON()
183+
if err != nil {
184+
t.Fatal(err)
190185
}
186+
headers := body["headers"].(map[string]any)
187+
191188
if headers["Hello"] != "World" {
192-
t.Errorf("Expected response headers %s", headers)
189+
t.Errorf("expected Hello header %q, got %v", "World", headers["Hello"])
193190
}
194191
if v, ok := headers["Authorization"]; ok {
195-
t.Errorf("Expecting blank authentication got %s", v)
192+
t.Errorf("expected no Authorization header, got %v", v)
196193
}
197194
})
198195

@@ -293,6 +290,26 @@ func TestQueryParamsPreserveRawKeys(t *testing.T) {
293290
}
294291
}
295292

293+
// startHeadersServer mimics httpbin.org's /headers endpoint, echoing the
294+
// request headers (and the resolved Host) back as JSON. This keeps the
295+
// header-handling tests off the unreliable external httpbin.org service.
296+
func startHeadersServer(t *testing.T) *httptest.Server {
297+
t.Helper()
298+
299+
server := httptest.NewServer(netHTTP.HandlerFunc(func(w netHTTP.ResponseWriter, r *netHTTP.Request) {
300+
headers := map[string]string{"Host": r.Host}
301+
for key, values := range r.Header {
302+
headers[key] = strings.Join(values, ",")
303+
}
304+
305+
w.Header().Set("Content-Type", "application/json")
306+
_ = json.NewEncoder(w).Encode(map[string]any{"headers": headers})
307+
}))
308+
t.Cleanup(server.Close)
309+
310+
return server
311+
}
312+
296313
// nolint:unused
297314
func loggerMiddlware(next netHTTP.RoundTripper) netHTTP.RoundTripper {
298315
x := func(req *netHTTP.Request) (*netHTTP.Response, error) {

0 commit comments

Comments
 (0)