diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/encoding/headermap.rs (renamed from src/headermap.rs) | 6 | ||||
-rw-r--r-- | src/encoding/headers.rs (renamed from src/headers.rs) | 0 | ||||
-rw-r--r-- | src/encoding/method.rs (renamed from src/method.rs) | 0 | ||||
-rw-r--r-- | src/encoding/mod.rs | 7 | ||||
-rw-r--r-- | src/encoding/request.rs (renamed from src/request.rs) | 2 | ||||
-rw-r--r-- | src/encoding/response.rs | 40 | ||||
-rw-r--r-- | src/encoding/status.rs (renamed from src/status.rs) | 0 | ||||
-rw-r--r-- | src/encoding/uri.rs (renamed from src/uri.rs) | 0 | ||||
-rw-r--r-- | src/lib.rs | 9 | ||||
-rw-r--r-- | src/response.rs | 7 | ||||
-rw-r--r-- | src/transport/client.rs | 0 | ||||
-rw-r--r-- | src/transport/mod.rs | 1 |
12 files changed, 56 insertions, 16 deletions
diff --git a/src/headermap.rs b/src/encoding/headermap.rs index 8712df1..313d8b5 100644 --- a/src/headermap.rs +++ b/src/encoding/headermap.rs @@ -1,7 +1,8 @@ -use crate::headers::Header; +use super::headers::Header; use anyhow::Result; use std::fmt::Display; +#[derive(Debug)] pub struct HeaderMap(pub Vec<(String, String)>); impl HeaderMap { @@ -18,6 +19,9 @@ impl HeaderMap { .find(|(k, _)| k == H::NAME) .map(|(_, v)| H::from_str(v)) } + pub fn insert_raw(&mut self, key: String, value: String) { + self.0.push((key, value)) + } } impl Display for HeaderMap { diff --git a/src/headers.rs b/src/encoding/headers.rs index d837ee5..d837ee5 100644 --- a/src/headers.rs +++ b/src/encoding/headers.rs diff --git a/src/method.rs b/src/encoding/method.rs index 5f8110a..5f8110a 100644 --- a/src/method.rs +++ b/src/encoding/method.rs diff --git a/src/encoding/mod.rs b/src/encoding/mod.rs new file mode 100644 index 0000000..a7dd227 --- /dev/null +++ b/src/encoding/mod.rs @@ -0,0 +1,7 @@ +pub mod headermap; +pub mod headers; +pub mod method; +pub mod request; +pub mod response; +pub mod status; +pub mod uri; diff --git a/src/request.rs b/src/encoding/request.rs index 827dae1..03b93c9 100644 --- a/src/request.rs +++ b/src/encoding/request.rs @@ -1,4 +1,4 @@ -use crate::{headermap::HeaderMap, method::Method, uri::Uri}; +use super::{headermap::HeaderMap, method::Method, uri::Uri}; use std::fmt::Display; pub struct Request { diff --git a/src/encoding/response.rs b/src/encoding/response.rs new file mode 100644 index 0000000..3564b34 --- /dev/null +++ b/src/encoding/response.rs @@ -0,0 +1,40 @@ +use super::headermap::HeaderMap; +use anyhow::{anyhow, bail, Context}; +use std::str::FromStr; + +#[derive(Debug)] +pub struct Response { + pub code: u16, + pub headers: HeaderMap, +} + +impl FromStr for Response { + type Err = anyhow::Error; + fn from_str(s: &str) -> Result<Self, Self::Err> { + let mut lines = s.lines(); + let statusline = lines.next().ok_or(anyhow!("status line missing"))?; + let (sipver, rest) = statusline + .split_once(" ") + .ok_or(anyhow!("status line malformed"))?; + let (code, _status_str) = rest + .split_once(" ") + .ok_or(anyhow!("status line malformed"))?; + let code = u16::from_str(code).context("status code")?; + + let Some(ver) = sipver.strip_prefix("SIP/") else { + bail!("sip version malformed"); + }; + if ver != "2.0" { + bail!("sip version {ver:?} is not supported"); + } + + 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(Self { code, headers }) + } +} diff --git a/src/status.rs b/src/encoding/status.rs index de9ea88..de9ea88 100644 --- a/src/status.rs +++ b/src/encoding/status.rs diff --git a/src/uri.rs b/src/encoding/uri.rs index 2d77df2..2d77df2 100644 --- a/src/uri.rs +++ b/src/encoding/uri.rs @@ -1,7 +1,2 @@ -pub mod headermap; -pub mod headers; -pub mod method; -pub mod request; -pub mod response; -pub mod status; -pub mod uri; +pub mod encoding; +pub mod transport; diff --git a/src/response.rs b/src/response.rs deleted file mode 100644 index 4403c6e..0000000 --- a/src/response.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::headermap::HeaderMap; - - -pub struct Reponse { - pub code: u16, - pub headers: HeaderMap, -} diff --git a/src/transport/client.rs b/src/transport/client.rs new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/transport/client.rs diff --git a/src/transport/mod.rs b/src/transport/mod.rs new file mode 100644 index 0000000..b9babe5 --- /dev/null +++ b/src/transport/mod.rs @@ -0,0 +1 @@ +pub mod client; |