Passed
Pull Request — master (#40)
by Stefano
03:01
created

client.NewClientFromConfig   C

Complexity

Conditions 10

Size

Total Lines 54
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 10
eloc 36
nop 6
dl 0
loc 54
rs 5.9999
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like client.NewClientFromConfig often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
package client
2
3
import (
4
	"context"
5
	"net"
6
	"net/http"
7
	"net/http/cookiejar"
8
	"net/url"
9
	"time"
10
11
	"github.com/pkg/errors"
12
	"github.com/stefanoj3/dirstalk/pkg/scan/client/cookie"
13
	"golang.org/x/net/proxy"
14
)
15
16
func NewClientFromConfig(
0 ignored issues
show
introduced by
exported function NewClientFromConfig should have comment or be unexported
Loading history...
17
	timeoutInMilliseconds int,
18
	socks5Url *url.URL,
19
	userAgent string,
20
	useCookieJar bool,
21
	cookies []*http.Cookie,
22
	u *url.URL,
23
) (*http.Client, error) {
24
	transport := http.Transport{
25
		MaxIdleConns:          100,
26
		IdleConnTimeout:       90 * time.Second,
27
		TLSHandshakeTimeout:   10 * time.Second,
28
		ExpectContinueTimeout: 1 * time.Second,
29
	}
30
31
	c := &http.Client{
32
		Timeout:   time.Millisecond * time.Duration(timeoutInMilliseconds),
33
		Transport: &transport,
34
	}
35
36
	if useCookieJar {
37
		jar, err := cookiejar.New(nil)
38
		if err != nil {
39
			return nil, errors.Wrap(err, "NewClientFromConfig: failed to create cookie jar")
40
		}
41
		c.Jar = jar
42
	}
43
44
	if c.Jar != nil {
45
		c.Jar.SetCookies(u, cookies)
46
	}
47
48
	if len(cookies) > 0 && c.Jar == nil {
49
		c.Jar = cookie.NewStatelessJar(cookies)
50
	}
51
52
	if socks5Url != nil {
53
		tbDialer, err := proxy.FromURL(socks5Url, proxy.Direct)
54
		if err != nil {
55
			return nil, errors.Wrap(err, "NewClientFromConfig: failed to create socks5 proxy")
56
		}
57
58
		transport.DialContext = func(ctx context.Context, network, addr string) (conn net.Conn, e error) {
59
			return tbDialer.Dial(network, addr)
60
		}
61
	}
62
63
	var err error
64
	c.Transport, err = decorateTransportWithUserAgentDecorator(c.Transport, userAgent)
65
	if err != nil {
66
		return nil, errors.Wrap(err, "NewClientFromConfig: failed to decorate transport")
67
	}
68
69
	return c, nil
70
}
71