File tree Expand file tree Collapse file tree 3 files changed +60
-5
lines changed Expand file tree Collapse file tree 3 files changed +60
-5
lines changed Original file line number Diff line number Diff line change @@ -472,11 +472,16 @@ func (r ReasonHeader) IsNormal() bool {
472472 return true // assume there's no specific reason
473473 }
474474 switch r .Type {
475- case "Q .850" :
475+ case "q .850" :
476476 switch r .Cause {
477477 case 16 : // Normal call clearing
478478 return true
479479 }
480+ case "x.int" :
481+ switch r .Cause {
482+ case 0x00 :
483+ return true
484+ }
480485 }
481486 return false
482487}
@@ -494,7 +499,9 @@ func ParseReasonHeader(header string) (ReasonHeader, error) {
494499 return ReasonHeader {}, errors .New ("no fields in the reason" )
495500 }
496501 typ := strings .TrimSpace (list [0 ])
502+ typ = strings .ToLower (typ )
497503 r := ReasonHeader {Type : typ }
504+ var reasonCode string
498505 for _ , line := range list [1 :] {
499506 line = strings .TrimSpace (line )
500507 i := strings .Index (line , "=" )
@@ -508,6 +515,23 @@ func ParseReasonHeader(header string) (ReasonHeader, error) {
508515 r .Cause , _ = strconv .Atoi (val )
509516 case "text" :
510517 r .Text , _ = strconv .Unquote (val )
518+ case "reasoncode" :
519+ reasonCode = val
520+ }
521+ }
522+ switch typ {
523+ case "x.int" :
524+ if r .Cause == 0 {
525+ if reasonCode != "" {
526+ v , _ := strconv .ParseUint (reasonCode , 0 , 64 )
527+ r .Cause = int (v )
528+ } else if r .Text != "" {
529+ v , err := strconv .ParseUint (r .Text , 0 , 64 )
530+ r .Cause = int (v )
531+ if err == nil {
532+ r .Text = ""
533+ }
534+ }
511535 }
512536 }
513537 return r , nil
Original file line number Diff line number Diff line change @@ -78,31 +78,62 @@ func TestParseReason(t *testing.T) {
7878 Name string
7979 Header string
8080 Reason ReasonHeader
81+ Normal bool
8182 }{
8283 {
8384 Name : "SIP" ,
8485 Header : `SIP ;cause=200 ;text="Call completed elsewhere"` ,
8586 Reason : ReasonHeader {
86- Type : "SIP " ,
87+ Type : "sip " ,
8788 Cause : 200 ,
8889 Text : "Call completed elsewhere" ,
8990 },
91+ Normal : false ,
9092 },
9193 {
9294 Name : "Q.850" ,
9395 Header : `Q.850;cause=16;text="Terminated"` ,
9496 Reason : ReasonHeader {
95- Type : "Q .850" ,
97+ Type : "q .850" ,
9698 Cause : 16 ,
9799 Text : "Terminated" ,
98100 },
101+ Normal : true ,
102+ },
103+ {
104+ Name : "X.int" ,
105+ Header : `X.int;text="0x00000000";add-info=05CC.0001.0001` ,
106+ Reason : ReasonHeader {
107+ Type : "x.int" ,
108+ Cause : 0x00 ,
109+ },
110+ Normal : true ,
111+ },
112+ {
113+ Name : "X.int not ok text" ,
114+ Header : `X.int;text="0x00000001";add-info=05CC.0001.0001` ,
115+ Reason : ReasonHeader {
116+ Type : "x.int" ,
117+ Cause : 0x01 ,
118+ },
119+ Normal : false ,
120+ },
121+ {
122+ Name : "X.int reason code" ,
123+ Header : `X.int;reasoncode=0x0000032D;add-info=05CC.0001.0004` ,
124+ Reason : ReasonHeader {
125+ Type : "x.int" ,
126+ Cause : 0x32D ,
127+ },
128+ Normal : false ,
99129 },
100130 }
101131 for _ , c := range cases {
102132 t .Run (c .Name , func (t * testing.T ) {
103133 r , err := ParseReasonHeader (c .Header )
104134 require .NoError (t , err )
105135 require .Equal (t , c .Reason , r )
136+ require .Equal (t , c .Normal , r .IsNormal ())
106137 })
107138 }
108139}
Original file line number Diff line number Diff line change @@ -421,7 +421,7 @@ func TestSIPJoinOpenRoom(t *testing.T) {
421421
422422 require .Equal (t , sipgo .REFER , referRequest .Method )
423423 transferTo := referRequest .GetHeader ("Refer-To" )
424- require .Equal (t , "< tel:" + transferNumber + ">" , transferTo .Value ())
424+ require .Equal (t , "tel:" + transferNumber , transferTo .Value ())
425425
426426 time .Sleep (notifyIntervalDelay )
427427 err = cli .SendNotify (referRequest , "SIP/2.0 100 Trying" )
@@ -577,7 +577,7 @@ func TestSIPJoinPinRoom(t *testing.T) {
577577
578578 require .Equal (t , sipgo .REFER , referRequest .Method )
579579 transferTo := referRequest .GetHeader ("Refer-To" )
580- require .Equal (t , "< tel:" + transferNumber + ">" , transferTo .Value ())
580+ require .Equal (t , "tel:" + transferNumber , transferTo .Value ())
581581
582582 time .Sleep (notifyIntervalDelay )
583583 err = cli .SendNotify (referRequest , "SIP/2.0 403 Fobidden" )
You can’t perform that action at this time.
0 commit comments