Skip to content

Commit

Permalink
Allow to set Host header for Client (#1169)
Browse files Browse the repository at this point in the history
* Allow to set Host header for Client

* Allow to change Host header without tests violation

* Rename AllowToChangeHostHeader and add tests.

* Allow to use empty uri.Host() when req.Header.Host() does not empty
  • Loading branch information
Tolyar committed Dec 17, 2021
1 parent 258a4c1 commit 4517204
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 8 deletions.
14 changes: 11 additions & 3 deletions http.go
Expand Up @@ -56,6 +56,9 @@ type Request struct {
// Request timeout. Usually set by DoDeadline or DoTimeout
// if <= 0, means not set
timeout time.Duration

// Use Host header (request.Header.SetHost) instead of the host from SetRequestURI, SetHost, or URI().SetHost
UseHostHeader bool
}

// Response represents HTTP response.
Expand Down Expand Up @@ -1394,10 +1397,15 @@ func (req *Request) Write(w *bufio.Writer) error {
if len(req.Header.Host()) == 0 || req.parsedURI {
uri := req.URI()
host := uri.Host()
if len(host) == 0 {
return errRequestHostRequired
if len(req.Header.Host()) == 0 {
if len(host) == 0 {
return errRequestHostRequired
} else {
req.Header.SetHostBytes(host)
}
} else if !req.UseHostHeader {
req.Header.SetHostBytes(host)
}
req.Header.SetHostBytes(host)
req.Header.SetRequestURIBytes(uri.RequestURI())

if len(uri.username) > 0 {
Expand Down
31 changes: 26 additions & 5 deletions http_test.go
Expand Up @@ -79,7 +79,7 @@ func TestIssue875(t *testing.T) {
expectedLocation string
}

var testcases = []testcase{
testcases := []testcase{
{
uri: `http://localhost:3000/?redirect=foo%0d%0aSet-Cookie:%20SESSIONID=MaliciousValue%0d%0a`,
expectedRedirect: "foo\r\nSet-Cookie: SESSIONID=MaliciousValue\r\n",
Expand Down Expand Up @@ -138,7 +138,6 @@ func TestRequestCopyTo(t *testing.T) {
t.Fatalf("unexpected error: %s", err)
}
testRequestCopyTo(t, &req)

}

func TestResponseCopyTo(t *testing.T) {
Expand All @@ -155,7 +154,6 @@ func TestResponseCopyTo(t *testing.T) {
resp.Header.SetStatusCode(200)
resp.SetBodyString("test")
testResponseCopyTo(t, &resp)

}

func testRequestCopyTo(t *testing.T, src *Request) {
Expand Down Expand Up @@ -731,6 +729,31 @@ func TestRequestUpdateURI(t *testing.T) {
}
}

func TestUseHostHeader(t *testing.T) {
t.Parallel()

var r Request
r.UseHostHeader = true
r.Header.SetHost("aaa.bbb")
r.SetRequestURI("/lkjkl/kjl")

// Modify request uri and host via URI() object and make sure
// the requestURI and Host header are properly updated
u := r.URI()
u.SetPath("/123/432.html")
u.SetHost("foobar.com")
a := u.QueryArgs()
a.Set("aaa", "bcse")

s := r.String()
if !strings.HasPrefix(s, "GET /123/432.html?aaa=bcse") {
t.Fatalf("cannot find %q in %q", "GET /123/432.html?aaa=bcse", s)
}
if !strings.Contains(s, "\r\nHost: aaa.bbb\r\n") {
t.Fatalf("cannot find %q in %q", "\r\nHost: aaa.bbb\r\n", s)
}
}

func TestRequestBodyStreamMultipleBodyCalls(t *testing.T) {
t.Parallel()

Expand Down Expand Up @@ -1190,7 +1213,6 @@ func TestRequestContinueReadBodyDisablePrereadMultipartForm(t *testing.T) {
if string(formData) != string(r.Body()) {
t.Fatalf("The body given must equal the body in the Request")
}

}

func TestRequestMayContinue(t *testing.T) {
Expand Down Expand Up @@ -2434,7 +2456,6 @@ Content-Type: application/json
`, "\n", "\r\n", -1)
mr := multipart.NewReader(strings.NewReader(s), "foo")
form, err := mr.ReadForm(1024)

if err != nil {
t.Fatalf("unexpected error: %s", err)
}
Expand Down

0 comments on commit 4517204

Please sign in to comment.