forked from emiago/sipgo
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathua.go
More file actions
127 lines (107 loc) · 2.99 KB
/
ua.go
File metadata and controls
127 lines (107 loc) · 2.99 KB
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package sipgo
import (
"crypto/tls"
"net"
"github.com/emiago/sipgo/sip"
)
type UserAgent struct {
name string
hostname string
dnsResolver *net.Resolver
tlsConfig *tls.Config
parser *sip.Parser
txOptions []sip.TransactionLayerOption
tpOptions []sip.TransportLayerOption
tp *sip.TransportLayer
tx *sip.TransactionLayer
}
type UserAgentOption func(s *UserAgent) error
// WithUserAgent changes user agent name
// Default: sipgo
func WithUserAgent(ua string) UserAgentOption {
return func(s *UserAgent) error {
s.name = ua
return nil
}
}
// WithUserAgentHostname represents FQDN of user that can be presented in From header
func WithUserAgentHostname(hostname string) UserAgentOption {
return func(s *UserAgent) error {
s.hostname = hostname
return nil
}
}
// WithUserAgentDNSResolver allows customizing default DNS resolver for transport layer
func WithUserAgentDNSResolver(r *net.Resolver) UserAgentOption {
return func(s *UserAgent) error {
s.dnsResolver = r
return nil
}
}
// WithUserAgenTLSConfig allows customizing default tls config.
func WithUserAgenTLSConfig(c *tls.Config) UserAgentOption {
return func(s *UserAgent) error {
s.tlsConfig = c
return nil
}
}
// WithUserAgentParser allows removing default behavior of parser
// You can define and remove default headers parser map and pass here.
// Only use if your benchmarks are better than default
func WithUserAgentParser(p *sip.Parser) UserAgentOption {
return func(s *UserAgent) error {
s.parser = p
return nil
}
}
// WithUserAgentTransactionLayerOptions allows setting options for the transaction layer
func WithUserAgentTransactionLayerOptions(o ...sip.TransactionLayerOption) UserAgentOption {
return func(s *UserAgent) error {
s.txOptions = o
return nil
}
}
// WithUserAgentTransportLayerOptions allows setting options for the transport layer
func WithUserAgentTransportLayerOptions(o ...sip.TransportLayerOption) UserAgentOption {
return func(s *UserAgent) error {
s.tpOptions = o
return nil
}
}
// NewUA creates User Agent
// User Agent will create transport and transaction layer
// Check options for customizing user agent
func NewUA(options ...UserAgentOption) (*UserAgent, error) {
ua := &UserAgent{
name: "sipgo",
hostname: "localhost",
dnsResolver: net.DefaultResolver,
parser: sip.NewParser(),
}
for _, o := range options {
if err := o(ua); err != nil {
return nil, err
}
}
ua.tp = sip.NewTransportLayer(ua.dnsResolver, ua.parser, ua.tlsConfig, ua.tpOptions...)
ua.tx = sip.NewTransactionLayer(ua.tp, ua.txOptions...)
return ua, nil
}
func (ua *UserAgent) Close() error {
// stop transaction layer
ua.tx.Close()
// stop transport layer
return ua.tp.Close()
}
func (ua *UserAgent) Name() string {
return ua.name
}
func (ua *UserAgent) Hostname() string {
return ua.hostname
}
func (ua *UserAgent) TransportLayer() *sip.TransportLayer {
return ua.tp
}
func (ua *UserAgent) TransactionLayer() *sip.TransactionLayer {
return ua.tx
}