aboutsummaryrefslogtreecommitdiff
path: root/client.go
diff options
context:
space:
mode:
Diffstat (limited to 'client.go')
-rw-r--r--client.go43
1 files changed, 40 insertions, 3 deletions
diff --git a/client.go b/client.go
index 45736f5..c028e42 100644
--- a/client.go
+++ b/client.go
@@ -1,7 +1,9 @@
package crawl
import (
+ "context"
"crypto/tls"
+ "net"
"net/http"
"net/http/cookiejar"
"time"
@@ -9,14 +11,19 @@ import (
var defaultClientTimeout = 60 * time.Second
-// DefaultClient returns a http.Client suitable for crawling: does not
-// follow redirects, accepts invalid TLS certificates, sets a
+// DefaultClient points at a shared http.Client suitable for crawling:
+// does not follow redirects, accepts invalid TLS certificates, sets a
// reasonable timeout for requests.
var DefaultClient *http.Client
func init() {
+ DefaultClient = NewHTTPClient()
+}
+
+// NewHTTPClient returns an http.Client suitable for crawling.
+func NewHTTPClient() *http.Client {
jar, _ := cookiejar.New(nil) // nolint
- DefaultClient = &http.Client{
+ return &http.Client{
Timeout: defaultClientTimeout,
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
@@ -29,3 +36,33 @@ func init() {
Jar: jar,
}
}
+
+// NewHTTPClientWithDNSOverride returns an http.Client suitable for
+// crawling, with some additional DNS overrides.
+func NewHTTPClientWithDNSOverride(dnsMap map[string]string) *http.Client {
+ jar, _ := cookiejar.New(nil) // nolint
+ dialer := new(net.Dialer)
+ transport := &http.Transport{
+ DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
+ host, port, err := net.SplitHostPort(addr)
+ if err != nil {
+ return nil, err
+ }
+ if override, ok := dnsMap[host]; ok {
+ addr = net.JoinHostPort(override, port)
+ }
+ return dialer.DialContext(ctx, network, addr)
+ },
+ TLSClientConfig: &tls.Config{
+ InsecureSkipVerify: true, // nolint
+ },
+ }
+ return &http.Client{
+ Timeout: defaultClientTimeout,
+ Transport: transport,
+ CheckRedirect: func(req *http.Request, via []*http.Request) error {
+ return http.ErrUseLastResponse
+ },
+ Jar: jar,
+ }
+}