Skip to content

Commit a877296

Browse files
authored
Normalize the reason type. (#482)
* Normalize the reason type. * Fix refer tests (again).
1 parent 578e932 commit a877296

File tree

3 files changed

+60
-5
lines changed

3 files changed

+60
-5
lines changed

pkg/sip/protocol.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff 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

pkg/sip/protocol_test.go

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff 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
}

test/integration/sip_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff 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")

0 commit comments

Comments
 (0)