libsip/headers/
mod.rs

1pub mod auth;
2mod content;
3mod language;
4mod named;
5pub mod parse;
6pub mod subscription_state;
7pub mod via;
8mod write;
9pub use self::{
10    auth::{AuthContext, AuthHeader, AuthSchema},
11    content::ContentType,
12    language::Language,
13    named::NamedHeader,
14    parse::parse_header,
15    subscription_state::SubscriptionState,
16};
17
18use crate::core::Method;
19
20/// Wrapper around a Vec<Header> to simplify creating
21/// and a list of headers
22#[derive(Debug, PartialEq, Clone, Default)]
23pub struct Headers(pub Vec<Header>);
24
25impl Headers {
26    pub fn new() -> Headers {
27        Headers(vec![])
28    }
29
30    /// Push a new Header onto the stack.
31    pub fn push(&mut self, h: Header) {
32        self.0.push(h)
33    }
34
35    /// Access the underlying vec iterator.
36    pub fn iter(&self) -> impl Iterator<Item = &Header> {
37        self.0.iter()
38    }
39
40    /// Add the Headers onto the interior Vec<Header>.
41    pub fn extend(&mut self, i: Vec<Header>) {
42        self.0.extend(i)
43    }
44
45    /// Return An Expires header if one is present.
46    pub fn expires(&self) -> Option<Header> {
47        for h in &self.0 {
48            if let Header::Expires(i) = h {
49                return Some(Header::Expires(*i));
50            }
51        }
52        None
53    }
54
55    /// Return the Event header if one is present.
56    pub fn event(&self) -> Option<Header> {
57        for h in &self.0 {
58            if let Header::Event(a) = h {
59                return Some(Header::Event(a.clone()));
60            }
61        }
62        None
63    }
64
65    /// Return the CSeq header if one is present.
66    pub fn cseq(&self) -> Option<Header> {
67        for h in &self.0 {
68            if let Header::CSeq(a, b) = h {
69                return Some(Header::CSeq(*a, *b));
70            }
71        }
72        None
73    }
74
75    /// Return the From header if one is present.
76    pub fn from(&self) -> Option<Header> {
77        for h in &self.0 {
78            if let Header::From(a) = h {
79                return Some(Header::From(a.clone()));
80            }
81        }
82        None
83    }
84
85    /// Return the To header if one is present.
86    pub fn to(&self) -> Option<Header> {
87        for h in &self.0 {
88            if let Header::To(a) = h {
89                return Some(Header::To(a.clone()));
90            }
91        }
92        None
93    }
94
95    /// Return the Contact header if one is present.
96    pub fn contact(&self) -> Option<Header> {
97        for h in &self.0 {
98            if let Header::Contact(a) = h {
99                return Some(Header::Contact(a.clone()));
100            }
101        }
102        None
103    }
104
105    /// Return the CoallId header if one is present.
106    pub fn call_id(&self) -> Option<Header> {
107        for h in &self.0 {
108            if let Header::CallId(a) = h {
109                return Some(Header::CallId(a.clone()));
110            }
111        }
112        None
113    }
114
115    /// Return the Via header if one is present.
116    pub fn via(&self) -> Option<Header> {
117        for h in &self.0 {
118            if let Header::Via(a) = h {
119                return Some(Header::Via(a.clone()));
120            }
121        }
122        None
123    }
124
125    /// Return the Subscription-State header if one is present.
126    pub fn subscription_state(&self) -> Option<Header> {
127        for h in &self.0 {
128            if let Header::SubscriptionState(s) = h {
129                return Some(Header::SubscriptionState(s.clone()));
130            }
131        }
132        None
133    }
134
135    /// Return XFS Sending Header if one is present.
136    pub fn xfs_sending_message(&self) -> Option<Header> {
137        for h in &self.0 {
138            if let Header::XFsSendingMessage(a) = h {
139                return Some(Header::XFsSendingMessage(a.clone()));
140            }
141        }
142        None
143    }
144}
145
146impl IntoIterator for Headers {
147    type IntoIter = ::std::vec::IntoIter<Self::Item>;
148    type Item = Header;
149
150    fn into_iter(self) -> Self::IntoIter {
151        self.0.into_iter()
152    }
153}
154
155/// Single SIP Header Representation.
156#[derive(Debug, PartialEq, Clone)]
157pub enum Header {
158    To(NamedHeader),
159    Contact(NamedHeader),
160    From(NamedHeader),
161    ReplyTo(NamedHeader),
162    CSeq(u32, Method),
163    MaxForwards(u32),
164    Event(String),
165    Expires(u32),
166    Accept(Vec<Method>),
167    ContentLength(u32),
168    Allow(Vec<Method>),
169    UserAgent(String),
170    CallId(String),
171    ContentType(ContentType),
172    ContentLanguage(Language),
173    ContentEncoding(ContentType),
174    AcceptLanguage(Language),
175    AcceptEncoding(ContentType),
176    AlertInfo(String),
177    ErrorInfo(String),
178    AuthenticationInfo(String),
179    Authorization(auth::AuthHeader),
180    CallInfo(String),
181    InReplyTo(String),
182    ContentDisposition(String),
183    Date(String),
184    MinExpires(u32),
185    MimeVersion(f32),
186    Organization(String),
187    ProxyAuthenticate(String),
188    ProxyAuthorization(String),
189    ProxyRequire(String),
190    Require(String),
191    RetryAfter(String),
192    Route(String),
193    Subject(String),
194    SubscriptionState(SubscriptionState),
195    RecordRoute(String),
196    Server(String),
197    Supported(Vec<String>),
198    Timestamp(u32),
199    Unsupported(String),
200    Warning(String),
201    Via(via::ViaHeader),
202    Priority(String),
203    WwwAuthenticate(auth::AuthHeader),
204    XFsSendingMessage(String),
205    Other(String, String),
206}