@@ -2,10 +2,12 @@ package http_test
22
33import (
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
297314func loggerMiddlware (next netHTTP.RoundTripper ) netHTTP.RoundTripper {
298315 x := func (req * netHTTP.Request ) (* netHTTP.Response , error ) {
0 commit comments