/
http_client.go
105 lines (91 loc) · 2.86 KB
/
http_client.go
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
105
// Package lib - this parts contains the *http.Client used to make requests.
//
// Could possibly just use another HTTP library that has some of these constants defined ...
package lib
import (
"crypto/tls"
"crypto/x509"
"io"
"net/http"
"time"
"github.com/pkg/errors"
"github.com/rs/zerolog"
)
// From https://golang.org/pkg/net/http/#pkg-overview:
//
// For control over proxies, TLS configuration, keep-alives, compression, and other settings, create a Transport:
//
// tr := &http.Transport{
// MaxIdleConns: 10,
// IdleConnTimeout: 30 * time.Second,
// DisableCompression: true,
// }
// client := &http.Client{Transport: tr}
// resp, err := client.Get("https://example.com")
const (
HTTPClientTimeoutDefault = 15 * time.Second
MaxIdleConns = 10
IdleConnTimeout = 30 * time.Second
DisableCompression = true
)
// HTTPClient - Just wraps *http.Client.
type HTTPClient struct {
*http.Client `json:"net_http_client,omitempty"`
LoggerParent *zerolog.Logger `json:"logger_parent,omitempty"` // Logger: parent logger. Use `Crawler.Logger()` to get contextual logger.
}
// NewHTTPClient - Make new client for issuing requests.
func NewHTTPClient(insecureSkipVerify bool, timeout time.Duration, loggerParent *zerolog.Logger) (*HTTPClient, error) {
logger := loggerParent.
With().Str("func", "NewHTTPClient").
Interface("insecureSkipVerify", insecureSkipVerify).
Interface("timeout", timeout).
Logger()
pool, err := x509.SystemCertPool()
if err != nil {
errWrapped := errors.Wrapf(
err,
"could not create HTTPClient due to failure in x509.SystemCertPool() - pool=%v",
pool,
)
logger.Error().Err(errWrapped).Interface("pool", pool).Msg("could not create HTTPClient")
return nil, errWrapped
}
// G402: TLS InsecureSkipVerify set true. (gosec)go-lint
// nolint:gosec
tlsConfig := tls.Config{
RootCAs: pool,
InsecureSkipVerify: insecureSkipVerify,
Renegotiation: tls.RenegotiateFreelyAsClient, // Turn off is this is an issue.
}
tlsConfig.BuildNameToCertificate()
// Does _not_ print outs the requests and responses
transportDefault := &http.Transport{
TLSClientConfig: &tlsConfig,
MaxIdleConns: MaxIdleConns,
IdleConnTimeout: IdleConnTimeout,
DisableCompression: DisableCompression,
}
// Prints outs the requests and responses
transportDebug := &DebugTransport{
Transport: transportDefault,
LoggerParent: loggerParent,
}
_, _ = transportDebug, transportDefault
transport := transportDefault
httpClient := &HTTPClient{
Client: &http.Client{
Transport: transport,
Timeout: timeout,
},
LoggerParent: loggerParent,
}
return httpClient, nil
}
// NewRequest - request.
func NewRequest(method, url string, body io.Reader) (*http.Request, error) {
req, err := http.NewRequest(method, url, body)
if err != nil {
return nil, err
}
return SetDefaultHeaders(req), nil
}