-
Notifications
You must be signed in to change notification settings - Fork 19
/
uarand.go
63 lines (53 loc) · 1.28 KB
/
uarand.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
package uarand
import (
"math/rand"
"sync"
"time"
)
var (
// Default is the UARand with default settings.
Default = New(
rand.New(
rand.NewSource(time.Now().UnixNano()),
),
)
)
// Randomizer represents some entity which could provide us an entropy.
type Randomizer interface {
Seed(n int64)
Intn(n int) int
}
// UARand describes the user agent randomizer settings.
type UARand struct {
Randomizer
UserAgents []string
mutex sync.Mutex
}
// GetRandom returns a random user agent from UserAgents slice.
func (u *UARand) GetRandom() string {
u.mutex.Lock()
n := u.Intn(len(u.UserAgents))
u.mutex.Unlock()
return u.UserAgents[n]
}
// GetRandom returns a random user agent from UserAgents slice.
// This version is driven by Default configuration.
func GetRandom() string {
return Default.GetRandom()
}
// New return UserAgent randomizer settings with default user-agents list
func New(r Randomizer) *UARand {
return &UARand{
Randomizer: r,
UserAgents: UserAgents,
mutex: sync.Mutex{},
}
}
// NewWithCustomList return UserAgent randomizer settings with custom user-agents list
func NewWithCustomList(userAgents []string) *UARand {
return &UARand{
Randomizer: rand.New(rand.NewSource(time.Now().UnixNano())),
UserAgents: userAgents,
mutex: sync.Mutex{},
}
}