summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/monaco-io/request/build.go
blob: 56323d169be6d2e883d1d0e2455ade38217ad698 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package request

import (
	"bytes"
	"net/http"
	"net/http/cookiejar"
	"net/url"
	"time"
)

// TODO: func unit test coverage
func (c *Client) buildRequest() (err error) {
	if err = c.applyRequest(); err != nil {
		return
	}

	c.applyHTTPHeader()
	c.applyBasicAuth()
	c.applyClient()
	c.applyTimeout()
	c.applyCookies()
	// Apply transport needs to be called before TLSConfig as TLSConfig modifies
	// the http transport
	c.applyTransport()
	c.applyTLSConfig()
	err = c.applyProxy()

	c.client.Transport = c.Transport
	return
}

func (c *Client) applyRequest() (err error) {
	// encode requestURL.httpURL like https://google.com?hello=world&package=request
	c.requestURL = requestURL{
		urlString:  c.URL,
		parameters: c.Params,
	}
	if err = c.requestURL.EncodeURL(); err != nil {
		return
	}
	c.req, err = http.NewRequest(c.Method, c.requestURL.string(), bytes.NewReader(c.Body))
	return
}

func (c *Client) applyHTTPHeader() {
	if c.Method == POST {
		if c.ContentType == emptyString {
			c.ContentType = ApplicationJSON
		}
		c.req.Header.Set(contentType, string(c.ContentType))
	}
	for k, v := range c.Header {
		c.req.Header.Add(k, v)
	}
}

func (c *Client) applyBasicAuth() {
	if c.BasicAuth.Username != emptyString && c.BasicAuth.Password != emptyString {
		c.req.SetBasicAuth(c.BasicAuth.Username, c.BasicAuth.Password)
	}
}

func (c *Client) applyClient() {
	c.client = &http.Client{}
}

func (c *Client) applyTimeout() {
	if c.Timeout > 0 {
		c.client.Timeout = c.Timeout * time.Second
	}
}

func (c *Client) applyCookies() {
	if c.Cookies != nil {
		jar, _ := cookiejar.New(nil)
		jar.SetCookies(&url.URL{Scheme: c.requestURL.scheme(), Host: c.requestURL.host()}, c.Cookies)
		c.client.Jar = jar
	}
}

// TODO: test case
func (c *Client) applyProxy() (err error) {
	if c.ProxyURL != emptyString {
		var proxy *url.URL
		if proxy, err = url.Parse(c.ProxyURL); err != nil {
			return
		} else if proxy != nil {
			c.Transport.Proxy = http.ProxyURL(proxy)
		}
	}
	return
}

func (c *Client) applyTLSConfig() {
	if c.TLSConfig != nil {
		c.Transport.TLSClientConfig = c.TLSConfig
	}
}

func (c *Client) applyTransport() {
	if c.Transport == nil {
		c.Transport = &http.Transport{}
	}
}