1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//! # Introduction
//!
//! Library for parsing/editing/constructing SIP requests and responses.
//!
//! This is the very first version where only simple parsing is support.
//!
//! ## Example
//! ```rust
//!
//! use sipmsg::*;
//! use unicase::Ascii;
//!
//! let invite_msg_buf = "\
//! INVITE sip:bob@biloxi.com;user=phone?to=alice%40atlanta.com&priority=urgent SIP/2.0\r\n\
//! Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKkjshdyff\r\n\
//! Via: SIP/2.0/UDP 192.168.1.111\r\n\
//! To: Bob <sip:bob@biloxi.com>\r\n\
//! From: Alice <sip:alice@atlanta.com>;tag=88sja8x\r\n\
//! Contact: Caller <sip:alice@client.atlanta.example.com;transport=tcp>\r\n\
//! Max-Forwards: 70\r\n\
//! Call-ID: f81d4fae-7dec-11d0-a765-00a0c91e6bf6@foo.bar.com\r\n\
//! Extention-Header: extention header value;param=123;without_value\r\n\
//! CSeq: 986759 INVITE\r\n\r\nbody_stuff"
//! .as_bytes();
//!
//! // First parameter not realized yet.
//! // It should consist be residue if Content-Length is less then actual body length.
//! let (_, request) = SipRequest::parse(invite_msg_buf).unwrap();
//! assert_eq!(request.rl.method, SipMethod::INVITE);
//! assert_eq!(request.rl.sip_version, SipVersion(2, 0));
//!
//! // RURI
//! assert_eq!(request.rl.uri.scheme, SipRequestUriScheme::SIP);
//! assert_eq!(request.rl.uri.user_info().unwrap().value, "bob");
//! assert_eq!(request.rl.uri.hostport.host, "biloxi.com");
//! assert_eq!(request.rl.uri.params().unwrap().get(&"user"), Some(&Some("phone")));
//! assert_eq!(request.rl.uri.headers().unwrap().get(&"to"), Some(&"alice%40atlanta.com"));
//! assert_eq!(request.rl.uri.headers().unwrap().get(&"priority"), Some(&"urgent"));
//!
//! let call_id_header = request.headers.get_rfc_s(SipRFCHeader::CallID).unwrap();
//! assert_eq!(call_id_header.value.vstr, "f81d4fae-7dec-11d0-a765-00a0c91e6bf6@foo.bar.com");
//! assert_eq!(call_id_header.value.tags().unwrap()[&SipHeaderTagType::ID],
//! "f81d4fae-7dec-11d0-a765-00a0c91e6bf6".as_bytes());
//! assert_eq!(call_id_header.value.tags().unwrap()[&SipHeaderTagType::Host], b"foo.bar.com");
//!
//! // Via Header
//! let via_headers = request.headers.get_rfc(SipRFCHeader::Via).unwrap();
//! assert_eq!(via_headers[0].value.vstr, "SIP/2.0/UDP pc33.atlanta.com");
//! assert_eq!(
//! via_headers[0].params().unwrap().get(&"branch"),
//! Some(&Some("z9hG4bKkjshdyff"))
//! );
//! assert_eq!(
//! via_headers[0].value.tags().unwrap()[&SipHeaderTagType::ProtocolName],
//! b"SIP"
//! );
//! assert_eq!(
//! via_headers[0].value.tags().unwrap()[&SipHeaderTagType::ProtocolVersion],
//! b"2.0"
//! );
//! assert_eq!(
//! via_headers[0].value.tags().unwrap()[&SipHeaderTagType::ProtocolTransport],
//! b"UDP"
//! );
//! assert_eq!(
//! via_headers[0].value.tags().unwrap()[&SipHeaderTagType::Host],
//! b"pc33.atlanta.com"
//! );
//! assert_eq!(via_headers[1].value.vstr, "SIP/2.0/UDP 192.168.1.111");
//! assert_eq!(
//! via_headers[1].params(),
//! None
//! );
//!
//! // Contact header
//! let contact_header = request.headers.get_rfc_s(SipRFCHeader::Contact).unwrap();
//! assert_eq!(
//! contact_header.value.tags().unwrap()[&SipHeaderTagType::DisplayName],
//! b"Caller"
//! );
//! assert_eq!(
//! contact_header.value.sip_uri().unwrap().user_info().unwrap().value,
//! "alice"
//! );
//! assert_eq!(
//! contact_header.value.sip_uri().unwrap().hostport.host,
//! "client.atlanta.example.com"
//! );
//!
//! assert_eq!(
//! contact_header.value.sip_uri().unwrap().params().unwrap().get(&"transport"),
//! Some(&Some("tcp"))
//! );
//! assert_eq!(
//! contact_header.value.sip_uri().unwrap().params().unwrap().get(&"non-exists-param"),
//! None
//! );
//!
//! // Extention Header
//! let extention_header = request.headers.get_ext_s("extention-header").unwrap();
//! assert_eq!(extention_header.name, "extention-header");
//! assert_eq!(extention_header.value.vstr, "extention header value;param=123;without_value");
//!
//! // Body
//! assert_eq!(request.body.unwrap(), b"body_stuff");
//! ```
//!
extern crate alloc;
extern crate nom;
pub use errorparse;
pub use SipMethod;
pub use NomParser;
pub use get_message_type as get_sip_message_type;
pub use MessageType as SipMessageType;
pub use SipVersion;
pub use Request as SipRequest;
pub use RequestLine as SipRequestLine;
pub use Response as SipResponse;
pub use StatusCode as SipResponseStatusCode;
pub use StatusLine as SipResponseStatusLine;
pub use RequestUriScheme as SipRequestUriScheme;
pub use *;
pub use Ascii as SipAscii;