Skip to content

Commit 0c1b23c

Browse files
committed
Move UserAgent setting to SipStack, and add original recipient to session.makeRequest.
1 parent e97754f commit 0c1b23c

File tree

7 files changed

+64
-42
lines changed

7 files changed

+64
-42
lines changed

examples/b2bua/b2bua/b2bua.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ func NewB2BUA() *B2BUA {
7171
}
7272

7373
stack := stack.NewSipStack(&stack.SipStackConfig{
74+
UserAgent: "Go B2BUA/1.0.0",
7475
Extensions: []string{"replaces", "outbound"},
7576
Dns: "8.8.8.8",
7677
ServerAuthManager: stack.ServerAuthManager{
@@ -100,8 +101,8 @@ func NewB2BUA() *B2BUA {
100101
}
101102

102103
ua := ua.NewUserAgent(&ua.UserAgentConfig{
103-
UserAgent: "Go B2BUA/1.0.0",
104-
SipStack: stack,
104+
105+
SipStack: stack,
105106
}, logger)
106107

107108
ua.InviteStateHandler = func(sess *session.Session, req *sip.Request, resp *sip.Response, state session.Status) {

examples/client/main.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ func createUdp() *rtp.RtpUDPStream {
4444
func main() {
4545
stop := make(chan os.Signal, 1)
4646
signal.Notify(stop, syscall.SIGTERM, syscall.SIGINT)
47-
stack := stack.NewSipStack(&stack.SipStackConfig{Extensions: []string{"replaces", "outbound"}, Dns: "8.8.8.8"}, logger)
47+
stack := stack.NewSipStack(&stack.SipStackConfig{
48+
UserAgent: "Go Sip Client/example-client",
49+
Extensions: []string{"replaces", "outbound"},
50+
Dns: "8.8.8.8"}, logger)
4851

4952
listen := "0.0.0.0:5080"
5053
logger.Infof("Listen => %s", listen)
@@ -62,8 +65,7 @@ func main() {
6265
}
6366

6467
ua := ua.NewUserAgent(&ua.UserAgentConfig{
65-
UserAgent: "Go Sip Client/1.0.0",
66-
SipStack: stack,
68+
SipStack: stack,
6769
}, logger)
6870

6971
ua.InviteStateHandler = func(sess *session.Session, req *sip.Request, resp *sip.Response, state session.Status) {
@@ -94,7 +96,7 @@ func main() {
9496
logger.Error(err)
9597
}
9698

97-
profile := account.NewProfile(uri.Clone(), "goSIP",
99+
profile := account.NewProfile(uri.Clone(), "goSIP/example-client",
98100
&account.AuthInfo{
99101
AuthUser: "100",
100102
Password: "100",
@@ -104,7 +106,7 @@ func main() {
104106
stack,
105107
)
106108

107-
recipient, err := parser.ParseSipUri("sip:[email protected]:5060;transport=udp")
109+
recipient, err := parser.ParseSipUri("sip:[email protected]:5081;transport=wss")
108110
if err != nil {
109111
logger.Error(err)
110112
}
@@ -121,10 +123,11 @@ func main() {
121123
logger.Error(err)
122124
}
123125

124-
recipient, err = parser.ParseSipUri("sip:[email protected]:5060;transport=udp")
126+
recipient, err = parser.ParseSipUri("sip:[email protected]:5081;transport=wss")
125127
if err != nil {
126128
logger.Error(err)
127129
}
130+
128131
go ua.Invite(profile, called, recipient, &sdp)
129132

130133
<-stop

examples/register/main.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,17 @@ func main() {
2727

2828
stop := make(chan os.Signal, 1)
2929
signal.Notify(stop, syscall.SIGTERM, syscall.SIGINT)
30-
stack := stack.NewSipStack(&stack.SipStackConfig{Extensions: []string{"replaces", "outbound"}, Dns: "8.8.8.8"}, logger)
30+
stack := stack.NewSipStack(&stack.SipStackConfig{
31+
UserAgent: "Go Sip Client/example-register",
32+
Extensions: []string{"replaces", "outbound"},
33+
Dns: "8.8.8.8"}, logger)
3134

3235
if err := stack.Listen("udp", "0.0.0.0:5066"); err != nil {
3336
logger.Panic(err)
3437
}
3538

3639
ua := ua.NewUserAgent(&ua.UserAgentConfig{
37-
UserAgent: "Go Sip Client/1.0.0",
38-
SipStack: stack,
40+
SipStack: stack,
3941
}, logger)
4042

4143
ua.RegisterStateHandler = func(state account.RegisterState) {

go.sum

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,6 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
6868
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
6969
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
7070
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
71-
github.com/ghettovoice/gosip v0.0.0-20210322152317-7858ea172631 h1:U4vU1rDtPKYCXl183LGxsXpoFZU3or2wq5S4qDKVusM=
72-
github.com/ghettovoice/gosip v0.0.0-20210322152317-7858ea172631/go.mod h1:yTr3BEYSFe9As6XM7ldyrVgqsPwlnw8Ahc4N28VFM2g=
7371
github.com/ghettovoice/gosip v0.0.0-20210329153648-7b01f22594e2 h1:gOjs4IPhn8bqWpwHhyxkMf7cYSOS00slfLe5bU7mUlE=
7472
github.com/ghettovoice/gosip v0.0.0-20210329153648-7b01f22594e2/go.mod h1:yTr3BEYSFe9As6XM7ldyrVgqsPwlnw8Ahc4N28VFM2g=
7573
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@@ -374,8 +372,7 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w
374372
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
375373
golang.org/x/sys v0.0.0-20210223095934-7937bea0104d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
376374
golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
377-
golang.org/x/sys v0.0.0-20210314195730-07df6a141424 h1:+39ahH47SWi1PhMRAHfIrm8f69HRZ5K2koXH6dmO8TQ=
378-
golang.org/x/sys v0.0.0-20210314195730-07df6a141424/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
375+
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4 h1:EZ2mChiOa8udjfp6rRmswTbtZN/QzUQp4ptM4rnjHvc=
379376
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
380377
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
381378
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -462,8 +459,6 @@ google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ
462459
google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
463460
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
464461
google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
465-
google.golang.org/api v0.42.0 h1:uqATLkpxiBrhrvFoebXUjvyzE9nQf+pVyy0Z0IHE+fc=
466-
google.golang.org/api v0.42.0/go.mod h1:+Oj4s6ch2SEGtPjGqfUfZonBH0GjQH89gTeKKAEGZKI=
467462
google.golang.org/api v0.43.0 h1:4sAyIHT6ZohtAQDoxws+ez7bROYmUlOVvsUscYCDTqA=
468463
google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
469464
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
@@ -512,8 +507,6 @@ google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6D
512507
google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
513508
google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
514509
google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
515-
google.golang.org/genproto v0.0.0-20210312152112-fc591d9ea70f h1:YRBxgxUW6GFi+AKsn8WGA9k1SZohK+gGuEqdeT5aoNQ=
516-
google.golang.org/genproto v0.0.0-20210312152112-fc591d9ea70f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
517510
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6 h1:4Xw2NwItrJOFR5s6PnK98PI6Bgw1LhMP1j/rO5WP0S4=
518511
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
519512
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=

pkg/session/session.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ func (s *Session) Provisional(statusCode sip.StatusCode, reason string) {
352352
}
353353

354354
func (s *Session) makeRequest(uaType string, method sip.RequestMethod, msgID sip.MessageID, inviteRequest sip.Request, inviteResponse sip.Response) sip.Request {
355-
byeRequest := sip.NewRequest(
355+
newRequest := sip.NewRequest(
356356
msgID,
357357
method,
358358
s.remoteTarget,
@@ -366,31 +366,32 @@ func (s *Session) makeRequest(uaType string, method sip.RequestMethod, msgID sip
366366
)
367367

368368
from := s.localURI.Clone().AsFromHeader()
369-
byeRequest.AppendHeader(from)
369+
newRequest.AppendHeader(from)
370370
to := s.remoteURI.Clone().AsToHeader()
371-
byeRequest.AppendHeader(to)
371+
newRequest.AppendHeader(to)
372+
newRequest.SetRecipient(s.request.Recipient())
372373

373374
if uaType == "UAC" {
374-
sip.CopyHeaders("Via", inviteRequest, byeRequest)
375+
sip.CopyHeaders("Via", inviteRequest, newRequest)
375376
if len(inviteRequest.GetHeaders("Route")) > 0 {
376-
sip.CopyHeaders("Route", inviteRequest, byeRequest)
377+
sip.CopyHeaders("Route", inviteRequest, newRequest)
377378
}
378379
} else if uaType == "UAS" {
379-
sip.CopyHeaders("Via", inviteRequest, byeRequest)
380+
sip.CopyHeaders("Via", inviteRequest, newRequest)
380381
if len(inviteResponse.GetHeaders("Route")) > 0 {
381-
sip.CopyHeaders("Route", inviteResponse, byeRequest)
382+
sip.CopyHeaders("Route", inviteResponse, newRequest)
382383
}
383-
byeRequest.SetDestination(inviteResponse.Destination())
384-
byeRequest.SetSource(inviteResponse.Source())
384+
newRequest.SetDestination(inviteResponse.Destination())
385+
newRequest.SetSource(inviteResponse.Source())
385386
}
386387

387388
maxForwardsHeader := sip.MaxForwards(70)
388-
byeRequest.AppendHeader(&maxForwardsHeader)
389-
sip.CopyHeaders("Call-ID", inviteRequest, byeRequest)
390-
sip.CopyHeaders("CSeq", inviteRequest, byeRequest)
391-
cseq, _ := byeRequest.CSeq()
389+
newRequest.AppendHeader(&maxForwardsHeader)
390+
sip.CopyHeaders("Call-ID", inviteRequest, newRequest)
391+
sip.CopyHeaders("CSeq", inviteRequest, newRequest)
392+
cseq, _ := newRequest.CSeq()
392393
cseq.SeqNo++
393394
cseq.MethodName = method
394395

395-
return byeRequest
396+
return newRequest
396397
}

pkg/stack/stack.go

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,12 @@ type SipStackConfig struct {
4646
Extensions []string
4747
MsgMapper sip.MessageMapper
4848
ServerAuthManager ServerAuthManager
49+
UserAgent string
4950
}
5051

5152
// SipStack a golang SIP Stack
5253
type SipStack struct {
54+
config *SipStackConfig
5355
listenPorts map[string]*sip.Port
5456
tp transport.Layer
5557
tx transaction.Layer
@@ -112,6 +114,7 @@ func NewSipStack(config *SipStackConfig, logger log.Logger) *SipStack {
112114
}
113115

114116
s := &SipStack{
117+
config: config,
115118
listenPorts: make(map[string]*sip.Port),
116119
host: host,
117120
ip: ip,
@@ -241,6 +244,21 @@ func (s *SipStack) handleRequest(req sip.Request, tx sip.ServerTransaction) {
241244
if !ok {
242245
logger.Warnf("SIP request %v handler not found", req.Method())
243246

247+
go func(tx sip.ServerTransaction, logger log.Logger) {
248+
for {
249+
select {
250+
case <-s.tx.Done():
251+
return
252+
case err, ok := <-tx.Errors():
253+
if !ok {
254+
return
255+
}
256+
257+
logger.Warnf("error from SIP server transaction %s: %s", tx, err)
258+
}
259+
}
260+
}(tx, logger)
261+
244262
res := sip.NewResponseFromRequest("", req, 405, "Method Not Allowed", "")
245263
if _, err := s.Respond(res); err != nil {
246264
logger.Errorf("respond '405 Method Not Allowed' failed: %s", err)
@@ -252,7 +270,7 @@ func (s *SipStack) handleRequest(req sip.Request, tx sip.ServerTransaction) {
252270
if s.authenticator != nil {
253271
authenticator := s.authenticator.Authenticator
254272
requiresChallenge := s.authenticator.RequiresChallenge
255-
if requiresChallenge(req) == true {
273+
if requiresChallenge(req) {
256274
go func() {
257275
if _, ok := authenticator.Authenticate(req, tx); ok {
258276
handler(req, tx)
@@ -493,8 +511,16 @@ func (s *SipStack) appendAutoHeaders(msg sip.Message) {
493511
}
494512

495513
if hdrs := msg.GetHeaders("User-Agent"); len(hdrs) == 0 {
496-
userAgent := sip.UserAgentHeader(DefaultUserAgent)
497-
msg.AppendHeader(&userAgent)
514+
userAgent := DefaultUserAgent
515+
if len(s.config.UserAgent) > 0 {
516+
userAgent = s.config.UserAgent
517+
}
518+
userAgentHeader := sip.UserAgentHeader(userAgent)
519+
msg.AppendHeader(&userAgentHeader)
520+
} else if len(s.config.UserAgent) > 0 {
521+
msg.RemoveHeader("User-Agent")
522+
userAgentHeader := sip.UserAgentHeader(s.config.UserAgent)
523+
msg.AppendHeader(&userAgentHeader)
498524
}
499525

500526
if s.tp.IsStreamed(msg.Transport()) {

pkg/ua/ua.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ import (
1919

2020
// UserAgentConfig .
2121
type UserAgentConfig struct {
22-
UserAgent string
23-
SipStack *stack.SipStack
22+
SipStack *stack.SipStack
2423
}
2524

2625
//InviteSessionHandler .
@@ -93,16 +92,13 @@ func (ua *UserAgent) buildRequest(
9392
builder.SetCallID(callID)
9493
}
9594

96-
userAgent := sip.UserAgentHeader(ua.config.UserAgent)
97-
builder.SetUserAgent(&userAgent)
98-
9995
req, err := builder.Build()
10096
if err != nil {
10197
ua.Log().Errorf("err => %v", err)
10298
return nil, err
10399
}
104100

105-
ua.Log().Infof("buildRequest %s => \n%v", method, req)
101+
//ua.Log().Infof("buildRequest %s => \n%v", method, req)
106102
return &req, nil
107103
}
108104

0 commit comments

Comments
 (0)