aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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.rs7
-rw-r--r--src/encoding/request.rs (renamed from src/request.rs)2
-rw-r--r--src/encoding/response.rs40
-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.rs9
-rw-r--r--src/response.rs7
-rw-r--r--src/transport/client.rs0
-rw-r--r--src/transport/mod.rs1
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
diff --git a/src/lib.rs b/src/lib.rs
index a7dd227..d9935d3 100644
--- a/src/lib.rs
+++ b/src/lib.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;