diff options
author | metamuffin <metamuffin@disroot.org> | 2024-07-06 01:19:02 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-07-06 01:19:02 +0200 |
commit | 5dd0fafce20ed37fdc97dc96539391ebdebffaff (patch) | |
tree | ad93b9e8d0e9c9c7dbe5a858902c2ba0114a47cf /src/encoding/request.rs | |
parent | a4c52bedef04cfb927f3d7809680fed0425a5125 (diff) | |
download | sip-rs-5dd0fafce20ed37fdc97dc96539391ebdebffaff.tar sip-rs-5dd0fafce20ed37fdc97dc96539391ebdebffaff.tar.bz2 sip-rs-5dd0fafce20ed37fdc97dc96539391ebdebffaff.tar.zst |
generalize to support requests. untested
Diffstat (limited to 'src/encoding/request.rs')
-rw-r--r-- | src/encoding/request.rs | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/encoding/request.rs b/src/encoding/request.rs index aecd006..c62bab3 100644 --- a/src/encoding/request.rs +++ b/src/encoding/request.rs @@ -1,5 +1,6 @@ use super::{headermap::HeaderMap, method::Method, uri::Uri}; -use std::fmt::Display; +use anyhow::{anyhow, bail}; +use std::{fmt::Display, str::FromStr}; #[derive(Debug, Clone)] pub struct Request { @@ -20,3 +21,34 @@ impl Display for Request { Ok(()) } } +impl FromStr for Request { + 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 (method, rest) = statusline + .split_once(" ") + .ok_or(anyhow!("status line malformed"))?; + let (uri, sipver) = rest + .split_once(" ") + .ok_or(anyhow!("status line malformed"))?; + + let Some(ver) = sipver.strip_prefix("SIP/") else { + bail!("sip version malformed"); + }; + if ver != "2.0" { + bail!("sip version {ver:?} is not supported"); + } + + let uri = Uri::from_str(uri)?; + + let headers = HeaderMap::parse(&mut lines)?; + let method = Method::from_str(method)?; + + Ok(Self { + headers, + method, + uri, + }) + } +} |