From f4905c1a833d8ecba24ee897ed58e3e92b7b0eb8 Mon Sep 17 00:00:00 2001 From: Anatoly Zherdev Date: Sun, 26 Dec 2021 13:01:20 +0300 Subject: [PATCH 1/2] Fix UseHostHeader for DoTimeout + tests --- http.go | 2 ++ http_test.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/http.go b/http.go index 81b2496ff6..c17b22f758 100644 --- a/http.go +++ b/http.go @@ -732,6 +732,8 @@ func (req *Request) copyToSkipBody(dst *Request) { dst.parsedPostArgs = req.parsedPostArgs dst.isTLS = req.isTLS + dst.UseHostHeader = req.UseHostHeader + // do not copy multipartForm - it will be automatically // re-created on the first call to MultipartForm. } diff --git a/http_test.go b/http_test.go index ac71903949..8183d41e6c 100644 --- a/http_test.go +++ b/http_test.go @@ -9,6 +9,8 @@ import ( "io" "io/ioutil" "mime/multipart" + "net/http" + "net/http/httptest" "reflect" "strconv" "strings" @@ -754,6 +756,41 @@ func TestUseHostHeader(t *testing.T) { } } +func TestUseHostHeader2(t *testing.T) { + testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Host != "SomeHost" { + http.Error(w, fmt.Sprintf("Expected Host header to be '%s', but got '%s'", "SomeHost", r.Host), http.StatusBadRequest) + } else { + w.WriteHeader(http.StatusOK) + } + })) + defer testServer.Close() + + client := &Client{} + req := AcquireRequest() + defer ReleaseRequest(req) + resp := AcquireResponse() + defer ReleaseResponse(resp) + + req.SetRequestURI(testServer.URL) + req.UseHostHeader = true + req.Header.SetHost("SomeHost") + if err := client.DoTimeout(req, resp, 1*time.Second); err != nil { + t.Fatalf("DoTimeout returned an error '%s'", err) + } else { + if resp.StatusCode() != http.StatusOK { + t.Fatalf("DoTimeout: %s", resp.body) + } + } + if err := client.Do(req, resp); err != nil { + t.Fatalf("DoTimeout returned an error '%s'", err) + } else { + if resp.StatusCode() != http.StatusOK { + t.Fatalf("Do: %s", resp.body) + } + } +} + func TestRequestBodyStreamMultipleBodyCalls(t *testing.T) { t.Parallel() From 75aa5f35950696a29661be7b2a25961df4e61d36 Mon Sep 17 00:00:00 2001 From: Anatoly Zherdev Date: Tue, 28 Dec 2021 11:08:06 +0300 Subject: [PATCH 2/2] Release UseHostHeader in ReleaseRequest() + tests --- http.go | 1 + http_test.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/http.go b/http.go index c17b22f758..d61eb622be 100644 --- a/http.go +++ b/http.go @@ -960,6 +960,7 @@ func (req *Request) Reset() { req.Header.Reset() req.resetSkipHeader() req.timeout = 0 + req.UseHostHeader = false } func (req *Request) resetSkipHeader() { diff --git a/http_test.go b/http_test.go index 8183d41e6c..426b70a532 100644 --- a/http_test.go +++ b/http_test.go @@ -757,6 +757,7 @@ func TestUseHostHeader(t *testing.T) { } func TestUseHostHeader2(t *testing.T) { + t.Parallel() testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Host != "SomeHost" { http.Error(w, fmt.Sprintf("Expected Host header to be '%s', but got '%s'", "SomeHost", r.Host), http.StatusBadRequest) @@ -791,6 +792,19 @@ func TestUseHostHeader2(t *testing.T) { } } +func TestUseHostHeaderAfterRelease(t *testing.T) { + t.Parallel() + req := AcquireRequest() + req.UseHostHeader = true + ReleaseRequest(req) + + req = AcquireRequest() + defer ReleaseRequest(req) + if req.UseHostHeader { + t.Fatalf("UseHostHeader was not released in ReleaseRequest()") + } +} + func TestRequestBodyStreamMultipleBodyCalls(t *testing.T) { t.Parallel()