From 46e10da3a844bd72485772242a28fa4d88ee8b58 Mon Sep 17 00:00:00 2001 From: Adnan Maolood Date: Sun, 14 Feb 2021 19:02:34 -0500 Subject: Make Request.Host optional --- client.go | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) (limited to 'client.go') diff --git a/client.go b/client.go index 3b612c1..6951222 100644 --- a/client.go +++ b/client.go @@ -59,10 +59,20 @@ func (c *Client) Get(url string) (*Response, error) { // // Generally Get will be used instead of Do. func (c *Client) Do(req *Request) (*Response, error) { - // Punycode request URL - if punycode, err := punycodeHost(req.URL.Host); err != nil { + // Punycode request URL host + hostname, port, err := net.SplitHostPort(req.URL.Host) + if err != nil { + // Likely no port + hostname = req.URL.Host + port = "1965" + } + punycode, err := punycodeHostname(hostname) + if err != nil { return nil, err - } else { + } + if hostname != punycode { + hostname = punycode + // Make a copy of the request _req := *req req = &_req @@ -70,17 +80,21 @@ func (c *Client) Do(req *Request) (*Response, error) { req.URL = &_url // Set the host - req.URL.Host = punycode + req.URL.Host = net.JoinHostPort(hostname, port) } - // Extract hostname and punycode it - hostname, port, err := net.SplitHostPort(req.Host) - if err != nil { - return nil, err - } - punycode, err := punycodeHostname(hostname) - if err != nil { - return nil, err + // Use request host if provided + if req.Host != "" { + hostname, port, err = net.SplitHostPort(req.Host) + if err != nil { + // Port is required + return nil, err + } + // Punycode hostname + hostname, err = punycodeHostname(hostname) + if err != nil { + return nil, err + } } // Connect to the host @@ -96,7 +110,7 @@ func (c *Client) Do(req *Request) (*Response, error) { VerifyConnection: func(cs tls.ConnectionState) error { return c.verifyConnection(hostname, punycode, cs) }, - ServerName: punycode, + ServerName: hostname, } ctx := req.Context @@ -109,7 +123,7 @@ func (c *Client) Do(req *Request) (*Response, error) { Timeout: c.Timeout, } - address := net.JoinHostPort(punycode, port) + address := net.JoinHostPort(hostname, port) netConn, err := dialer.DialContext(ctx, "tcp", address) if err != nil { return nil, err -- cgit v1.2.3