From 32040e57435a4d0cf2cb847520e8daafa4d8ad97 Mon Sep 17 00:00:00 2001 From: Anatolii Kurotych Date: Sat, 17 Oct 2020 14:56:26 +0300 Subject: [PATCH] Add RFC4475 Short Tortuous INVITE --- crates/sipmsg/tests/rfc4475.rs | 229 +++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 crates/sipmsg/tests/rfc4475.rs diff --git a/crates/sipmsg/tests/rfc4475.rs b/crates/sipmsg/tests/rfc4475.rs new file mode 100644 index 0000000..4101363 --- /dev/null +++ b/crates/sipmsg/tests/rfc4475.rs @@ -0,0 +1,229 @@ +use sipmsg::*; + +#[test] +fn parse_request() { + let invite_msg_buf = "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 \\\"\" \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\r\n\ + Route: \r\n \ + \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 \\\"\\\"\" ; newparam =\r\n \ + newvalue ;\r\n \ + secondparam ; q = 0.33\r\n\ + \r\n\ + v=0\ + o=mhandley 29739 7272939 IN IP4 192.0.2.3\ + s=-\ + c=IN IP4 192.0.2.4\ + t=0 0\ + m=audio 49217 RTP/AVP 0 12\ + m=video 3227 RTP/AVP 31\ + a=rtpmap:31 LPC" + .as_bytes(); + + let res = SipRequest::parse(invite_msg_buf); + let (_, parsed_req) = res.unwrap(); + let request_line = &parsed_req.rl; + let headers = &parsed_req.headers; + assert_eq!(request_line.method, SipMethod::INVITE); + assert_eq!(request_line.uri.scheme, SipRequestUriScheme::SIP); + assert_eq!(request_line.uri.user_info().unwrap().value, "vivekg"); + assert_eq!(request_line.uri.hostport.host, "chair-dnrc.example.com"); + assert_eq!(request_line.sip_version, SipVersion(2, 0)); + assert_eq!( + request_line.uri.params().unwrap().get(&"unknownparam"), + Some(&None) + ); + + let to_hdr = headers.get_rfc_s(SipRFCHeader::To).unwrap(); + assert_eq!( + to_hdr.params().unwrap().get(&"tag"), + Some(&Some("1918181833n")) + ); + assert_eq!(to_hdr.value.vstr, "sip:vivekg@chair-dnrc.example.com"); + + let from_hdr = headers.get_rfc_s(SipRFCHeader::From).unwrap(); + assert_eq!( + from_hdr.value.vstr, + "\"J Rosenberg \\\"\" " + ); + assert_eq!( + from_hdr.value.tags().unwrap()[&SipHeaderTagType::DisplayName], + b"J Rosenberg \\\"" + ); + assert_eq!( + from_hdr.value.sip_uri().unwrap().user_info().unwrap().value, + "jdrosen" + ); + assert_eq!( + from_hdr.value.sip_uri().unwrap().hostport.host, + "example.com" + ); + assert_eq!( + from_hdr.params().unwrap().get(&"tag"), + Some(&Some("98asjd8")) + ); + + let max_forwards = parsed_req + .headers + .get_rfc_s(SipRFCHeader::MaxForwards) + .unwrap(); + assert_eq!(max_forwards.value.vstr, "0068"); + assert_eq!(max_forwards.params(), None); + assert_eq!(max_forwards.value.vtype, SipHeaderValueType::Digit); + + let call_id = headers.get_rfc_s(SipRFCHeader::CallID).unwrap(); + assert_eq!(call_id.value.vstr, "wsinv.ndaksdj@192.0.2.1"); + assert_eq!( + call_id.value.tags().unwrap()[&SipHeaderTagType::ID], + b"wsinv.ndaksdj" + ); + assert_eq!( + call_id.value.tags().unwrap()[&SipHeaderTagType::Host], + b"192.0.2.1" + ); + + let content_length = &parsed_req + .headers + .get_rfc_s(SipRFCHeader::ContentLength) + .unwrap(); + assert_eq!(content_length.value.vstr, "150"); + + let cseq_header = &headers.get_rfc_s(SipRFCHeader::CSeq).unwrap(); + assert_eq!(cseq_header.value.vstr, "0009\r\n INVITE"); + assert_eq!(cseq_header.params(), None); + assert_eq!( + cseq_header.value.tags().unwrap()[&SipHeaderTagType::Number], + b"0009" + ); + assert_eq!( + cseq_header.value.tags().unwrap()[&SipHeaderTagType::Method], + b"INVITE" + ); + + let via_hdrs = headers.get_rfc(SipRFCHeader::Via).unwrap(); + let first_via = &via_hdrs[0]; + assert_eq!(first_via.value.vstr, "SIP / 2.0\r\n /UDP\r\n 192.0.2.2"); + assert_eq!( + first_via.params().unwrap().get(&"branch"), + Some(&Some("390skdjuw")) + ); + + assert_eq!( + first_via.value.tags().unwrap()[&SipHeaderTagType::ProtocolName], + b"SIP" + ); + assert_eq!( + first_via.value.tags().unwrap()[&SipHeaderTagType::ProtocolVersion], + b"2.0" + ); + assert_eq!( + first_via.value.tags().unwrap()[&SipHeaderTagType::ProtocolTransport], + b"UDP" + ); + assert_eq!( + first_via.value.tags().unwrap()[&SipHeaderTagType::Host], + b"192.0.2.2" + ); + + let seond_via = &via_hdrs[1]; + assert_eq!( + seond_via.value.tags().unwrap()[&SipHeaderTagType::ProtocolTransport], + b"TCP" + ); + assert_eq!( + seond_via.value.vstr, + "SIP / 2.0 / TCP spindle.example.com" + ); + assert_eq!( + seond_via.value.tags().unwrap()[&SipHeaderTagType::Host], + b"spindle.example.com" + ); + assert_eq!( + seond_via.params().unwrap().get(&"branch"), + Some(&Some("z9hG4bK9ikj8")) + ); + + let subject_hdr = &headers.get_rfc_s(SipRFCHeader::Subject).unwrap(); + assert_eq!(subject_hdr.value.vtype, SipHeaderValueType::EmptyValue); + + let new_fangled_header = &headers.get_ext_s("newfangledheader").unwrap(); + assert_eq!( + new_fangled_header.value.vstr, + "newfangled value\r\n continued newfangled value" + ); + + let unknown_header_with_unusual_value = + &headers.get_ext_s("unknownHeaderwithunusualValue").unwrap(); + assert_eq!(unknown_header_with_unusual_value.value.vstr, ";;,,;;,;"); + + let content_type = &headers.get_rfc_s(SipRFCHeader::ContentType).unwrap(); + assert_eq!(content_type.value.vstr, "application/sdp"); + + let route_header = &headers.get_rfc_s(SipRFCHeader::Route).unwrap(); + assert_eq!( + route_header.value.vstr, + "" + ); + let route_uri = &route_header.value.sip_uri().unwrap(); + let route_uri_params = &route_uri.params().unwrap(); + assert_eq!(route_uri.scheme, sipuri::RequestUriScheme::SIP); + assert_eq!(route_uri.hostport.host, "services.example.com"); + assert_eq!(route_uri_params.get(&"lr"), Some(&None)); + assert_eq!(route_uri_params.get(&"unknownwith"), Some(&Some("value"))); + assert_eq!(route_uri_params.get(&"unknown-no-value"), Some(&None)); + assert_eq!(route_uri_params.get(&"missing_param"), None); + + let contact = &headers.get_rfc_s(SipRFCHeader::Contact).unwrap(); + assert_eq!( + contact.value.vstr, + "\"Quoted string \\\"\\\"\" " + ); + assert_eq!( + contact.value.tags().unwrap()[&SipHeaderTagType::DisplayName], + b"Quoted string \\\"\\\"" + ); + let contact_params = contact.params().unwrap(); + assert_eq!(contact_params.get(&"newparam"), Some(&Some("newvalue"))); + assert_eq!(contact_params.get(&"secondparam"), Some(&None)); + assert_eq!(contact_params.get(&"q"), Some(&Some("0.33"))); + + let contact_uri = &contact.value.sip_uri().unwrap(); + assert_eq!(contact_uri.scheme, sipuri::RequestUriScheme::SIP); + assert_eq!(contact_uri.user_info().unwrap().value, "jdrosen"); + assert_eq!(contact_uri.hostport.host, "example.com"); + assert_eq!(contact_uri.params(), None); + /*********************************************************/ + assert_eq!( + parsed_req.body.unwrap(), + "v=0\ + o=mhandley 29739 7272939 IN IP4 192.0.2.3\ + s=-\ + c=IN IP4 192.0.2.4\ + t=0 0\ + m=audio 49217 RTP/AVP 0 12\ + m=video 3227 RTP/AVP 31\ + a=rtpmap:31 LPC" + .as_bytes() + ); +}