diff --git a/net/net.go b/net/net.go index cf37aaa..a987587 100644 --- a/net/net.go +++ b/net/net.go @@ -320,7 +320,11 @@ func makeHTTPRequest(urlStr string, options HTTPRequestOptions, config NetworkCo } for name, value := range options.Headers { - req.Header.Set(name, value) + if strings.EqualFold(name, "Host") { + req.Host = value + } else { + req.Header.Set(name, value) + } result.RequestHeaders.Set(name, value) } diff --git a/net/net_test.go b/net/net_test.go index efd11c8..a68d4d2 100644 --- a/net/net_test.go +++ b/net/net_test.go @@ -380,6 +380,37 @@ func TestCheckWebsiteWithHeaders(t *testing.T) { } } +func TestCheckWebsiteWithHostHeader(t *testing.T) { + const wantHost = "virtual.example.com" + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Host != wantHost { + w.WriteHeader(400) + return + } + w.WriteHeader(200) + _, _ = w.Write([]byte("OK")) + })) + defer server.Close() + + config := NetworkConfig{ + Timeout: 5 * time.Second, + Headers: []string{"Host: " + wantHost}, + } + + result := CheckWebsite(server.URL, config) + + if !result.IsUp { + t.Errorf("CheckWebsite() with Host header should succeed, got status %d", result.StatusCode) + } + if result.StatusCode != 200 { + t.Errorf("CheckWebsite() StatusCode = %d, want 200", result.StatusCode) + } + if got := result.RequestHeaders.Get("Host"); got != wantHost { + t.Errorf("RequestHeaders Host = %q, want %q", got, wantHost) + } +} + func TestCheckWebsiteBodyLimit(t *testing.T) { tests := []struct { name string