From cbc111f90b5facc1f2a9dd79ced216279d6260af Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 19 Nov 2024 02:08:52 +0100 Subject: move files + rtp parser --- sip/src/encoding/headermap.rs | 60 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 sip/src/encoding/headermap.rs (limited to 'sip/src/encoding/headermap.rs') diff --git a/sip/src/encoding/headermap.rs b/sip/src/encoding/headermap.rs new file mode 100644 index 0000000..01e1962 --- /dev/null +++ b/sip/src/encoding/headermap.rs @@ -0,0 +1,60 @@ +use super::headers::Header; +use anyhow::{anyhow, Result}; +use std::fmt::Display; + +#[derive(Debug, Clone)] +pub struct HeaderMap(pub Vec<(String, String)>); + +impl HeaderMap { + pub fn new() -> Self { + Self(vec![]) + } + pub fn add(mut self, h: H) -> Self { + self.0.push((H::NAME.to_string(), format!("{h}"))); + self + } + pub fn insert(&mut self, h: H) { + self.0.push((H::NAME.to_string(), format!("{h}"))); + } + pub fn get_raw(&self, name: &str) -> Option<&str> { + self.0 + .iter() + .find(|(k, _)| k.eq_ignore_ascii_case(name)) + .map(|(_, v)| v.as_str()) + } + pub fn get(&self) -> Option> { + self.get_raw(H::NAME).map(H::from_str) + } + pub fn get_res(&self) -> Result { + self.get().ok_or(anyhow!("{} header missing", H::NAME))? + } + pub fn insert_raw(&mut self, key: String, value: String) { + self.0.push((key, value)) + } +} + +impl Display for HeaderMap { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + for (k, v) in &self.0 { + write!(f, "{k}: {v}\r\n")?; + } + Ok(()) + } +} +impl HeaderMap { + pub fn parse<'a>(lines: &mut impl Iterator) -> Result { + let mut headers = HeaderMap::new(); + for line in lines { + // TODO multiline values + let (key, value) = line.split_once(":").ok_or(anyhow!("header malformed"))?; + headers.insert_raw(key.trim().to_string(), value.trim().to_string()) + } + Ok(headers) + } +} + +impl FromIterator<(String, String)> for HeaderMap { + fn from_iter>(iter: T) -> Self { + Self(Vec::from_iter(iter)) + } +} -- cgit v1.2.3-70-g09d2