diff --git a/client.go b/client.go index 55709b47..527ba3f0 100644 --- a/client.go +++ b/client.go @@ -758,7 +758,7 @@ func (c *Client) SetTransport(transport http.RoundTripper) *Client { // client.SetScheme("http") func (c *Client) SetScheme(scheme string) *Client { if !IsStringEmpty(scheme) { - c.scheme = scheme + c.scheme = strings.TrimSpace(scheme) } return c } diff --git a/client_test.go b/client_test.go index 790fcb4a..84ae715e 100644 --- a/client_test.go +++ b/client_test.go @@ -744,3 +744,46 @@ func TestResponseError(t *testing.T) { assertNotNil(t, re.Unwrap()) assertEqual(t, err.Error(), re.Error()) } + +func TestHostURLForGH318AndGH407(t *testing.T) { + ts := createPostServer(t) + defer ts.Close() + + targetURL, _ := url.Parse(ts.URL) + t.Log("ts.URL:", ts.URL) + t.Log("targetURL.Host:", targetURL.Host) + // Sample output + // ts.URL: http://127.0.0.1:55967 + // targetURL.Host: 127.0.0.1:55967 + + // Unable use the local http test server for this + // use case testing + // + // using `targetURL.Host` value or test case yield to ERROR + // "parse "127.0.0.1:55967": first path segment in URL cannot contain colon" + + // test the functionality with httpbin.org locally + // will figure out later + + c := dc() + // c.SetScheme("http") + // c.SetHostURL(targetURL.Host + "/") + + // t.Log("with leading `/`") + // resp, err := c.R().Post("/login") + // assertNil(t, err) + // assertNotNil(t, resp) + + // t.Log("\nwithout leading `/`") + // resp, err = c.R().Post("login") + // assertNil(t, err) + // assertNotNil(t, resp) + + t.Log("with leading `/` on request & with trailing `/` on host url") + c.SetHostURL(ts.URL + "/") + resp, err := c.R(). + SetBody(map[string]interface{}{"username": "testuser", "password": "testpass"}). + Post("/login") + assertNil(t, err) + assertNotNil(t, resp) +} diff --git a/middleware.go b/middleware.go index 7461c806..60b1ebad 100644 --- a/middleware.go +++ b/middleware.go @@ -60,6 +60,11 @@ func parseRequestURL(c *Client, r *Request) error { } } + // GH #407 && #318 + if reqURL.Scheme == "" && len(c.scheme) > 0 { + reqURL.Scheme = c.scheme + } + // Adding Query Param query := make(url.Values) for k, v := range c.QueryParam { @@ -191,12 +196,6 @@ func createHTTPRequest(c *Client, r *Request) (err error) { r.RawRequest.AddCookie(cookie) } - // it's for non-http scheme option - if r.RawRequest.URL != nil && r.RawRequest.URL.Scheme == "" { - r.RawRequest.URL.Scheme = c.scheme - r.RawRequest.URL.Host = r.URL - } - // Enable trace if c.trace || r.trace { r.clientTrace = &clientTrace{}