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#[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 pub fn push(&mut self, h: Header) {
32 self.0.push(h)
33 }
34
35 pub fn iter(&self) -> impl Iterator<Item = &Header> {
37 self.0.iter()
38 }
39
40 pub fn extend(&mut self, i: Vec<Header>) {
42 self.0.extend(i)
43 }
44
45 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 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 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 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 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 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 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 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 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 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#[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}