|
|
|
@ -403,7 +403,7 @@ var msgTests = []msgTest{ |
|
|
|
msgTest{ |
|
|
|
name: "Via Line Continuation", |
|
|
|
s: "SIP/2.0 200 OK\r\n" + |
|
|
|
"Via: SIP/2.0/UDP 10.11.34.37,\r\n" + |
|
|
|
"Via: SIP/2.0/UDP 10.11.34.37 ,\r\n" + |
|
|
|
" SIP/2.0/UDP 10.11.34.38\r\n" + |
|
|
|
"Warning: Maids heard the goblins cry\r\n" + |
|
|
|
"\r\n", |
|
|
|
@ -912,139 +912,139 @@ var msgTests = []msgTest{ |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
// msgTest{
|
|
|
|
// name: "RFC4475 Torture Message #1",
|
|
|
|
// s: "INVITE sip:vivekg@chair-dnrc.example.com;unknownparam SIP/2.0\r\n" +
|
|
|
|
// "TO :\r\n" +
|
|
|
|
// " sip:vivekg@chair-dnrc.example.com ; tag = 1918181833n\r\n" +
|
|
|
|
// "from : \"J Rosenberg \\\\\\\"\" <sip:jdrosen@example.com>\r\n" +
|
|
|
|
// " ;\r\n" +
|
|
|
|
// " tag = 98asjd8\r\n" +
|
|
|
|
// "MaX-fOrWaRdS: 0068\r\n" +
|
|
|
|
// "Call-ID: wsinv.ndaksdj@192.0.2.1\r\n" +
|
|
|
|
// "Content-Length : 150\r\n" +
|
|
|
|
// "cseq: 0009\r\n" +
|
|
|
|
// " INVITE\r\n" +
|
|
|
|
// "Via : SIP / 2.0\r\n" +
|
|
|
|
// " /UDP\r\n" +
|
|
|
|
// " 192.0.2.2;branch=390skdjuw\r\n" +
|
|
|
|
// "s :\r\n" +
|
|
|
|
// "NewFangledHeader: newfangled value\r\n" +
|
|
|
|
// " continued newfangled value\r\n" +
|
|
|
|
// "UnknownHeaderWithUnusualValue: ;;,,;;,;\r\n" +
|
|
|
|
// "Content-Type: application/sdp-JART\r\n" +
|
|
|
|
// "Route:\r\n" +
|
|
|
|
// " <sip:services.example.com;lr;unknownwith=value;unknown-no-value>\r\n" +
|
|
|
|
// "v: SIP / 2.0 / TCP spindle.example.com ;\r\n" +
|
|
|
|
// " branch = z9hG4bK9ikj8 ,\r\n" +
|
|
|
|
// " SIP / 2.0 / UDP 192.168.255.111 ; branch=\r\n" +
|
|
|
|
// " z9hG4bK30239\r\n" +
|
|
|
|
// "m:\"Quoted string \\\"\\\"\" <sip:jdrosen@example.com> ; newparam =\r\n" +
|
|
|
|
// " newvalue ;\r\n" +
|
|
|
|
// " secondparam ; q = 0.33\r\n" +
|
|
|
|
// "\r\n" +
|
|
|
|
// "v=0\r\n" +
|
|
|
|
// "o=mhandley 29739 7272939 IN IP4 192.0.2.3\r\n" +
|
|
|
|
// "s=-\r\n" +
|
|
|
|
// "c=IN IP4 192.0.2.4\r\n" +
|
|
|
|
// "t=0 0\r\n" +
|
|
|
|
// "m=audio 49217 RTP/AVP 0 12\r\n" +
|
|
|
|
// "m=video 3227 RTP/AVP 31\r\n" +
|
|
|
|
// "a=rtpmap:31 LPC\r\n",
|
|
|
|
// msg: sip.Msg{
|
|
|
|
// Method: "INVITE",
|
|
|
|
// VersionMajor: 2,
|
|
|
|
// Request: &sip.URI{
|
|
|
|
// Scheme: "sip",
|
|
|
|
// User: "vivekg",
|
|
|
|
// Host: "chair-dnrc.example.com",
|
|
|
|
// Params: sip.Params{"unknownparam": ""},
|
|
|
|
// },
|
|
|
|
// To: &sip.Addr{
|
|
|
|
// Uri: &sip.URI{
|
|
|
|
// Scheme: "sip",
|
|
|
|
// User: "vivekg",
|
|
|
|
// Host: "chair-dnrc.example.com",
|
|
|
|
// },
|
|
|
|
// Params: sip.Params{"tag": "1918181833n"},
|
|
|
|
// },
|
|
|
|
// From: &sip.Addr{
|
|
|
|
// Display: "J Rosenberg \\\"",
|
|
|
|
// Uri: &sip.URI{
|
|
|
|
// Scheme: "sip",
|
|
|
|
// User: "vivekg",
|
|
|
|
// Host: "chair-dnrc.example.com",
|
|
|
|
// Params: sip.Params{"tag": "98asjd8"},
|
|
|
|
// },
|
|
|
|
// },
|
|
|
|
// MaxForwards: 68,
|
|
|
|
// CallID: "wsinv.ndaksdj@192.0.2.1",
|
|
|
|
// CSeq: 9,
|
|
|
|
// CSeqMethod: "INVITE",
|
|
|
|
// Via: &sip.Via{
|
|
|
|
// Protocol: "SIP",
|
|
|
|
// Version: "2.0",
|
|
|
|
// Transport: "UDP",
|
|
|
|
// Host: "192.0.2.2",
|
|
|
|
// Params: sip.Params{"branch": "390skdjuw"},
|
|
|
|
// Next: &sip.Via{
|
|
|
|
// Protocol: "SIP",
|
|
|
|
// Version: "2.0",
|
|
|
|
// Transport: "TCP",
|
|
|
|
// Host: "spindle.example.com",
|
|
|
|
// Params: sip.Params{"branch": "z9hG4bK9ikj8"},
|
|
|
|
// Next: &sip.Via{
|
|
|
|
// Protocol: "SIP",
|
|
|
|
// Version: "2.0",
|
|
|
|
// Transport: "UDP",
|
|
|
|
// Host: "192.168.255.111",
|
|
|
|
// Params: sip.Params{"branch": "z9hG4bK30239"},
|
|
|
|
// },
|
|
|
|
// },
|
|
|
|
// },
|
|
|
|
// Subject: "",
|
|
|
|
// Headers: sip.Headers{
|
|
|
|
// "NewFangledHeader": "newfangled value\r\n" +
|
|
|
|
// " continued newfangled value",
|
|
|
|
// "UnknownHeaderWithUnusualValue": ";;,,;;,;",
|
|
|
|
// },
|
|
|
|
// Route: &sip.Addr{
|
|
|
|
// Uri: &sip.URI{
|
|
|
|
// Scheme: "sip",
|
|
|
|
// Host: "services.example.com",
|
|
|
|
// Params: sip.Params{
|
|
|
|
// "lr": "",
|
|
|
|
// "unknownwith": "value",
|
|
|
|
// "unknown-no-value": "",
|
|
|
|
// },
|
|
|
|
// },
|
|
|
|
// },
|
|
|
|
// Contact: &sip.Addr{
|
|
|
|
// Display: "Quoted string \"\"",
|
|
|
|
// Uri: &sip.URI{
|
|
|
|
// Scheme: "sip",
|
|
|
|
// User: "jdrosen",
|
|
|
|
// Host: "example.com",
|
|
|
|
// },
|
|
|
|
// Params: sip.Params{
|
|
|
|
// "newparam": "newvalue",
|
|
|
|
// "secondparam": "",
|
|
|
|
// "q": "0.33",
|
|
|
|
// },
|
|
|
|
// },
|
|
|
|
// Payload: &sip.MiscPayload{
|
|
|
|
// T: "application/sdp-JART",
|
|
|
|
// D: []byte("v=0\r\n" +
|
|
|
|
// "o=mhandley 29739 7272939 IN IP4 192.0.2.3\r\n" +
|
|
|
|
// "s=-\r\n" +
|
|
|
|
// "c=IN IP4 192.0.2.4\r\n" +
|
|
|
|
// "t=0 0\r\n" +
|
|
|
|
// "m=audio 49217 RTP/AVP 0 12\r\n" +
|
|
|
|
// "m=video 3227 RTP/AVP 31\r\n" +
|
|
|
|
// "a=rtpmap:31 LPC\r\n"),
|
|
|
|
// },
|
|
|
|
// },
|
|
|
|
// },
|
|
|
|
msgTest{ |
|
|
|
name: "RFC4475 Torture Message #1", |
|
|
|
s: "INVITE sip:vivekg@chair-dnrc.example.com;unknownparam SIP/2.0\r\n" + |
|
|
|
"TO :\r\n" + |
|
|
|
" sip:vivekg@chair-dnrc.example.com ; tag = 1918181833n\r\n" + |
|
|
|
"from : \"J Rosenberg \\\\\\\"\" <sip:jdrosen@example.com>\r\n" + |
|
|
|
" ;\r\n" + |
|
|
|
" tag = 98asjd8\r\n" + |
|
|
|
"MaX-fOrWaRdS: 0068\r\n" + |
|
|
|
"Call-ID: wsinv.ndaksdj@192.0.2.1\r\n" + |
|
|
|
"Content-Length : 150\r\n" + |
|
|
|
"cseq: 0009\r\n" + |
|
|
|
" INVITE\r\n" + |
|
|
|
"Via : SIP / 2.0\r\n" + |
|
|
|
" /UDP\r\n" + |
|
|
|
" 192.0.2.2;branch=390skdjuw\r\n" + |
|
|
|
"s :\r\n" + |
|
|
|
"NewFangledHeader: newfangled value\r\n" + |
|
|
|
" continued newfangled value\r\n" + |
|
|
|
"UnknownHeaderWithUnusualValue: ;;,,;;,;\r\n" + |
|
|
|
"Content-Type: application/sdp-JART\r\n" + |
|
|
|
"Route:\r\n" + |
|
|
|
" <sip:services.example.com;lr;unknownwith=value;unknown-no-value>\r\n" + |
|
|
|
"v: SIP / 2.0 / TCP spindle.example.com ;\r\n" + |
|
|
|
" branch = z9hG4bK9ikj8 ,\r\n" + |
|
|
|
" SIP / 2.0 / UDP 192.168.255.111 ; branch=\r\n" + |
|
|
|
" z9hG4bK30239\r\n" + |
|
|
|
"m:\"Quoted string \\\"\\\"\" <sip:jdrosen@example.com> ; newparam =\r\n" + |
|
|
|
" newvalue ;\r\n" + |
|
|
|
" secondparam ; q = 0.33\r\n" + |
|
|
|
"\r\n" + |
|
|
|
"v=0\r\n" + |
|
|
|
"o=mhandley 29739 7272939 IN IP4 192.0.2.3\r\n" + |
|
|
|
"s=-\r\n" + |
|
|
|
"c=IN IP4 192.0.2.4\r\n" + |
|
|
|
"t=0 0\r\n" + |
|
|
|
"m=audio 49217 RTP/AVP 0 12\r\n" + |
|
|
|
"m=video 3227 RTP/AVP 31\r\n" + |
|
|
|
"a=rtpmap:31 LPC\r\n", |
|
|
|
msg: sip.Msg{ |
|
|
|
Method: "INVITE", |
|
|
|
VersionMajor: 2, |
|
|
|
Request: &sip.URI{ |
|
|
|
Scheme: "sip", |
|
|
|
User: "vivekg", |
|
|
|
Host: "chair-dnrc.example.com", |
|
|
|
Params: sip.Params{"unknownparam": ""}, |
|
|
|
}, |
|
|
|
To: &sip.Addr{ |
|
|
|
Uri: &sip.URI{ |
|
|
|
Scheme: "sip", |
|
|
|
User: "vivekg", |
|
|
|
Host: "chair-dnrc.example.com", |
|
|
|
}, |
|
|
|
Params: sip.Params{"tag": "1918181833n"}, |
|
|
|
}, |
|
|
|
From: &sip.Addr{ |
|
|
|
Display: "J Rosenberg \\\"", |
|
|
|
Uri: &sip.URI{ |
|
|
|
Scheme: "sip", |
|
|
|
User: "vivekg", |
|
|
|
Host: "chair-dnrc.example.com", |
|
|
|
Params: sip.Params{"tag": "98asjd8"}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
MaxForwards: 68, |
|
|
|
CallID: "wsinv.ndaksdj@192.0.2.1", |
|
|
|
CSeq: 9, |
|
|
|
CSeqMethod: "INVITE", |
|
|
|
Via: &sip.Via{ |
|
|
|
Protocol: "SIP", |
|
|
|
Version: "2.0", |
|
|
|
Transport: "UDP", |
|
|
|
Host: "192.0.2.2", |
|
|
|
Params: sip.Params{"branch": "390skdjuw"}, |
|
|
|
Next: &sip.Via{ |
|
|
|
Protocol: "SIP", |
|
|
|
Version: "2.0", |
|
|
|
Transport: "TCP", |
|
|
|
Host: "spindle.example.com", |
|
|
|
Params: sip.Params{"branch": "z9hG4bK9ikj8"}, |
|
|
|
Next: &sip.Via{ |
|
|
|
Protocol: "SIP", |
|
|
|
Version: "2.0", |
|
|
|
Transport: "UDP", |
|
|
|
Host: "192.168.255.111", |
|
|
|
Params: sip.Params{"branch": "z9hG4bK30239"}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
Subject: "", |
|
|
|
Headers: sip.Headers{ |
|
|
|
"NewFangledHeader": "newfangled value\r\n" + |
|
|
|
" continued newfangled value", |
|
|
|
"UnknownHeaderWithUnusualValue": ";;,,;;,;", |
|
|
|
}, |
|
|
|
Route: &sip.Addr{ |
|
|
|
Uri: &sip.URI{ |
|
|
|
Scheme: "sip", |
|
|
|
Host: "services.example.com", |
|
|
|
Params: sip.Params{ |
|
|
|
"lr": "", |
|
|
|
"unknownwith": "value", |
|
|
|
"unknown-no-value": "", |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
Contact: &sip.Addr{ |
|
|
|
Display: "Quoted string \"\"", |
|
|
|
Uri: &sip.URI{ |
|
|
|
Scheme: "sip", |
|
|
|
User: "jdrosen", |
|
|
|
Host: "example.com", |
|
|
|
}, |
|
|
|
Params: sip.Params{ |
|
|
|
"newparam": "newvalue", |
|
|
|
"secondparam": "", |
|
|
|
"q": "0.33", |
|
|
|
}, |
|
|
|
}, |
|
|
|
Payload: &sip.MiscPayload{ |
|
|
|
T: "application/sdp-JART", |
|
|
|
D: []byte("v=0\r\n" + |
|
|
|
"o=mhandley 29739 7272939 IN IP4 192.0.2.3\r\n" + |
|
|
|
"s=-\r\n" + |
|
|
|
"c=IN IP4 192.0.2.4\r\n" + |
|
|
|
"t=0 0\r\n" + |
|
|
|
"m=audio 49217 RTP/AVP 0 12\r\n" + |
|
|
|
"m=video 3227 RTP/AVP 31\r\n" + |
|
|
|
"a=rtpmap:31 LPC\r\n"), |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
} |
|
|
|
|
|
|
|
func TestParseMsg(t *testing.T) { |
|
|
|
@ -1070,7 +1070,7 @@ func TestParseMsg(t *testing.T) { |
|
|
|
t.Errorf("Via:\n%#v !=\n%#v", test.msg.Via, msg.Via) |
|
|
|
t.Errorf("Via #2:\n%#v !=\n%#v", test.msg.Via.Next, msg.Via.Next) |
|
|
|
t.Errorf("Via #3:\n%#v !=\n%#v", test.msg.Via.Next.Next, msg.Via.Next.Next) |
|
|
|
t.Errorf("Via #4:\n%#v !=\n%#v", test.msg.Via.Next.Next.Next, msg.Via.Next.Next.Next) |
|
|
|
// t.Errorf("Via #4:\n%#v !=\n%#v", test.msg.Via.Next.Next.Next, msg.Via.Next.Next.Next)
|
|
|
|
} |
|
|
|
if !reflect.DeepEqual(test.msg.Request, msg.Request) { |
|
|
|
t.Errorf("Request:\n%#v !=\n%#v", test.msg.Request, msg.Request) |
|
|
|
|