Skip to content

Commit e949025

Browse files
committed
fix bugs.
1 parent 07d5fc4 commit e949025

File tree

5 files changed

+48
-45
lines changed

5 files changed

+48
-45
lines changed

pkg/auth/server.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"strings"
99
"time"
1010

11-
"github.com/cloudwebrtc/go-sip-ua/pkg/util"
1211
"github.com/ghettovoice/gosip/log"
1312
"github.com/ghettovoice/gosip/sip"
1413
)
@@ -108,9 +107,7 @@ func (auth *ServerAuthorizer) requestAuthentication(request sip.Request, tx sip.
108107
created: time.Now(),
109108
}
110109
response.SetBody("", true)
111-
util.BuildContactHeader("Contact", request, response, nil)
112110
tx.Respond(response)
113-
return
114111
}
115112

116113
func (auth *ServerAuthorizer) checkAuthorization(request sip.Request, tx sip.ServerTransaction,

pkg/session/session.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
gosip_util "github.com/ghettovoice/gosip/util"
1111
)
1212

13-
type RequestCallback func(ctx context.Context, request sip.Request, authorizer sip.Authorizer, waitForResult bool) (sip.Response, error)
13+
type RequestCallback func(ctx context.Context, request sip.Request, authorizer sip.Authorizer, waitForResult bool, attempt int) (sip.Response, error)
1414

1515
type Session struct {
1616
lock sync.Mutex
@@ -240,7 +240,7 @@ func (s *Session) Bye() {
240240

241241
func (s *Session) sendRequest(req sip.Request) (sip.Response, error) {
242242
s.Log().Debugf(s.uaType+" send request: %v => \n%v", req.Method(), req)
243-
return s.requestCallbck(context.TODO(), req, nil, false)
243+
return s.requestCallbck(context.TODO(), req, nil, false, 1)
244244
}
245245

246246
// Reject Reject incoming call or for re-INVITE or UPDATE,
@@ -249,6 +249,7 @@ func (s *Session) Reject(statusCode sip.StatusCode, reason string) {
249249
request := s.request
250250
s.Log().Debugf("Reject: Request => %s, body => %s", request.Short(), request.Body())
251251
response := sip.NewResponseFromRequest(request.MessageID(), request, statusCode, reason, "")
252+
response.AppendHeader(s.localURI.AsContactHeader())
252253
tx.Respond(response)
253254
}
254255

@@ -346,7 +347,7 @@ func (s *Session) Provisional(statusCode sip.StatusCode, reason string) {
346347
} else {
347348
response = sip.NewResponseFromRequest(request.MessageID(), request, statusCode, reason, "")
348349
}
349-
350+
response.AppendHeader(s.localURI.AsContactHeader())
350351
s.response = response
351352
tx.Respond(response)
352353
}
@@ -370,14 +371,21 @@ func (s *Session) makeRequest(uaType string, method sip.RequestMethod, msgID sip
370371
to := s.remoteURI.Clone().AsToHeader()
371372
newRequest.AppendHeader(to)
372373
newRequest.SetRecipient(s.request.Recipient())
374+
sip.CopyHeaders("Via", inviteRequest, newRequest)
373375

374376
if uaType == "UAC" {
375-
sip.CopyHeaders("Via", inviteRequest, newRequest)
377+
if contact, ok := s.request.Contact(); ok {
378+
newRequest.AppendHeader(contact)
379+
}
380+
376381
if len(inviteRequest.GetHeaders("Route")) > 0 {
377382
sip.CopyHeaders("Route", inviteRequest, newRequest)
378383
}
379384
} else if uaType == "UAS" {
380-
sip.CopyHeaders("Via", inviteRequest, newRequest)
385+
if contact, ok := s.response.Contact(); ok {
386+
newRequest.AppendHeader(contact)
387+
}
388+
381389
if len(inviteResponse.GetHeaders("Route")) > 0 {
382390
sip.CopyHeaders("Route", inviteResponse, newRequest)
383391
}
@@ -389,6 +397,7 @@ func (s *Session) makeRequest(uaType string, method sip.RequestMethod, msgID sip
389397
newRequest.AppendHeader(&maxForwardsHeader)
390398
sip.CopyHeaders("Call-ID", inviteRequest, newRequest)
391399
sip.CopyHeaders("CSeq", inviteRequest, newRequest)
400+
392401
cseq, _ := newRequest.CSeq()
393402
cseq.SeqNo++
394403
cseq.MethodName = method

pkg/stack/stack.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,6 @@ func (s *SipStack) AckInviteRequest(request sip.Request, response sip.Response)
334334
ackRequest := sip.NewAckRequest("", request, response, "", log.Fields{
335335
"sent_at": time.Now(),
336336
})
337-
ackRequest.SetRecipient(request.Recipient())
338337
if err := s.Send(ackRequest); err != nil {
339338
s.Log().WithFields(map[string]interface{}{
340339
"invite_request": request.Short(),
@@ -348,7 +347,6 @@ func (s *SipStack) CancelRequest(request sip.Request, response sip.Response) {
348347
cancelRequest := sip.NewCancelRequest("", request, log.Fields{
349348
"sent_at": time.Now(),
350349
})
351-
cancelRequest.SetRecipient(request.Recipient())
352350
if err := s.Send(cancelRequest); err != nil {
353351
s.Log().WithFields(map[string]interface{}{
354352
"invite_request": request.Short(),

pkg/ua/register.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (r *Register) SendRegister(expires uint32) error {
7676
r.authorizer = auth.NewClientAuthorizer(profile.AuthInfo.AuthUser, profile.AuthInfo.Password)
7777
}
7878

79-
resp, err := ua.RequestWithContext(r.ctx, *r.request, r.authorizer, true)
79+
resp, err := ua.RequestWithContext(r.ctx, *r.request, r.authorizer, true, 1)
8080

8181
if err != nil {
8282
ua.Log().Errorf("Request [%s] failed, err => %v", sip.REGISTER, err)

pkg/ua/ua.go

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package ua
33
import (
44
"context"
55
"fmt"
6-
"net"
6+
"strconv"
77
"sync"
88

99
"github.com/cloudwebrtc/go-sip-ua/pkg/account"
@@ -102,32 +102,6 @@ func (ua *UserAgent) buildRequest(
102102
return &req, nil
103103
}
104104

105-
func (ua *UserAgent) buildViaHopHeader(target sip.SipUri) *sip.ViaHop {
106-
protocol := "udp"
107-
if nt, ok := target.UriParams().Get("transport"); ok {
108-
protocol = nt.String()
109-
}
110-
s := ua.config.SipStack
111-
netinfo := s.GetNetworkInfo(protocol)
112-
113-
var host string = netinfo.Host
114-
if net.ParseIP(target.Host()).IsLoopback() {
115-
host = "127.0.0.1"
116-
}
117-
118-
port := netinfo.Port
119-
120-
viaHop := &sip.ViaHop{
121-
ProtocolName: "SIP",
122-
ProtocolVersion: "2.0",
123-
Transport: protocol,
124-
Host: host,
125-
Port: port,
126-
Params: sip.NewParams().Add("branch", sip.String{Str: sip.GenerateBranch()}),
127-
}
128-
return viaHop
129-
}
130-
131105
func (ua *UserAgent) SendRegister(profile *account.Profile, recipient sip.SipUri, expires uint32, userdata interface{}) (*Register, error) {
132106
register := NewRegister(ua, profile, recipient, userdata)
133107
err := register.SendRegister(expires)
@@ -169,7 +143,7 @@ func (ua *UserAgent) Invite(profile *account.Profile, target sip.Uri, recipient
169143
authorizer = auth.NewClientAuthorizer(profile.AuthInfo.AuthUser, profile.AuthInfo.Password)
170144
}
171145

172-
resp, err := ua.RequestWithContext(context.TODO(), *request, authorizer, false)
146+
resp, err := ua.RequestWithContext(context.TODO(), *request, authorizer, false, 1)
173147
if err != nil {
174148
ua.Log().Errorf("INVITE: Request [INVITE] failed, err => %v", err)
175149
return nil, err
@@ -188,7 +162,7 @@ func (ua *UserAgent) Invite(profile *account.Profile, target sip.Uri, recipient
188162
}
189163
}
190164

191-
return nil, fmt.Errorf("Invite session not found, unknown errors.")
165+
return nil, fmt.Errorf("invite session not found, unknown errors")
192166
}
193167

194168
func (ua *UserAgent) Request(req *sip.Request) (sip.ClientTransaction, error) {
@@ -198,6 +172,32 @@ func (ua *UserAgent) Request(req *sip.Request) (sip.ClientTransaction, error) {
198172
func (ua *UserAgent) handleBye(request sip.Request, tx sip.ServerTransaction) {
199173
ua.Log().Debugf("handleBye: Request => %s, body => %s", request.Short(), request.Body())
200174
response := sip.NewResponseFromRequest(request.MessageID(), request, 200, "OK", "")
175+
176+
if viaHop, ok := request.ViaHop(); ok {
177+
var (
178+
host string
179+
port sip.Port
180+
)
181+
host = viaHop.Host
182+
if viaHop.Params != nil {
183+
if received, ok := viaHop.Params.Get("received"); ok && received.String() != "" {
184+
host = received.String()
185+
}
186+
if rport, ok := viaHop.Params.Get("rport"); ok && rport != nil && rport.String() != "" {
187+
if p, err := strconv.Atoi(rport.String()); err == nil {
188+
port = sip.Port(uint16(p))
189+
}
190+
} else if request.Recipient().Port() != nil {
191+
port = *request.Recipient().Port()
192+
} else {
193+
port = sip.DefaultPort(request.Transport())
194+
}
195+
}
196+
197+
dest := fmt.Sprintf("%v:%v", host, port)
198+
response.SetDestination(dest)
199+
}
200+
201201
tx.Respond(response)
202202
callID, ok := request.CallID()
203203
if ok {
@@ -290,7 +290,7 @@ func (ua *UserAgent) handleInvite(request sip.Request, tx sip.ServerTransaction)
290290
}
291291

292292
// RequestWithContext .
293-
func (ua *UserAgent) RequestWithContext(ctx context.Context, request sip.Request, authorizer sip.Authorizer, waitForResult bool) (sip.Response, error) {
293+
func (ua *UserAgent) RequestWithContext(ctx context.Context, request sip.Request, authorizer sip.Authorizer, waitForResult bool, attempt int) (sip.Response, error) {
294294
s := ua.config.SipStack
295295
tx, err := s.Request(request)
296296
if err != nil {
@@ -401,12 +401,13 @@ func (ua *UserAgent) RequestWithContext(ctx context.Context, request sip.Request
401401
}
402402

403403
// unauth request
404-
if (response.StatusCode() == 401 || response.StatusCode() == 407) && authorizer != nil {
404+
needAuth := (response.StatusCode() == 401 || response.StatusCode() == 407) && attempt < 2
405+
if needAuth && authorizer != nil {
405406
if err := authorizer.AuthorizeRequest(request, response); err != nil {
406407
errs <- err
407408
return
408409
}
409-
if response, err := ua.RequestWithContext(ctx, request, nil, true); err == nil {
410+
if response, err := ua.RequestWithContext(ctx, request, authorizer, true, attempt+1); err == nil {
410411
responses <- response
411412
} else {
412413
errs <- err
@@ -455,7 +456,6 @@ func (ua *UserAgent) RequestWithContext(ctx context.Context, request sip.Request
455456
if v, found := ua.iss.Load(*callID); found {
456457
is := v.(*session.Session)
457458
ua.iss.Delete(*callID)
458-
// handle Ringing or Processing with sdp
459459
is.SetState(session.Failure)
460460
ua.handleInviteState(is, &request, &response, session.Failure, nil)
461461
}
@@ -466,7 +466,6 @@ func (ua *UserAgent) RequestWithContext(ctx context.Context, request sip.Request
466466
if ok {
467467
if v, found := ua.iss.Load(*callID); found {
468468
if request.IsInvite() {
469-
// handle Ringing or Processing with sdp
470469
is := v.(*session.Session)
471470
is.SetState(session.Confirmed)
472471
ua.handleInviteState(is, &request, &response, session.Confirmed, nil)

0 commit comments

Comments
 (0)