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/transport/udp.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 sip/src/transport/udp.rs (limited to 'sip/src/transport/udp.rs') diff --git a/sip/src/transport/udp.rs b/sip/src/transport/udp.rs new file mode 100644 index 0000000..c0d7829 --- /dev/null +++ b/sip/src/transport/udp.rs @@ -0,0 +1,35 @@ +use super::Transport; +use crate::encoding::Message; +use anyhow::{anyhow, Result}; +use log::debug; +use std::str::FromStr; +use tokio::net::UdpSocket; + +pub struct UdpTransport { + sock: UdpSocket, +} + +impl UdpTransport { + pub async fn new(sock: UdpSocket) -> Result { + Ok(Self { sock }) + } +} +impl Transport for UdpTransport { + async fn recv(&self) -> Result { + let mut buf = [0; 1024]; + let size = self.sock.recv(&mut buf).await?; + let message = String::from_utf8(buf[..size].to_vec())?; + let (head, body) = message + .split_once("\r\n\r\n") + .ok_or(anyhow!("header end missing"))?; + debug!("<- {head}\n\n{body}"); + let mut mesg = Message::from_str(head.trim_end())?; + *mesg.body_mut() = body.to_string(); + Ok(mesg) + } + async fn send(&self, request: Message) -> Result<()> { + debug!("-> {request}"); + self.sock.send(format!("{request}").as_bytes()).await?; + Ok(()) + } +} -- cgit v1.2.3-70-g09d2