aboutsummaryrefslogtreecommitdiff
path: root/src/transport
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-07-05 23:37:39 +0200
committermetamuffin <metamuffin@disroot.org>2024-07-05 23:37:39 +0200
commita4c52bedef04cfb927f3d7809680fed0425a5125 (patch)
tree96e11f458049a3944fbfd1bd30fe9826d385c80d /src/transport
parentb5e408b02cd99a7833faab9b46d33042786c568c (diff)
downloadsip-rs-a4c52bedef04cfb927f3d7809680fed0425a5125.tar
sip-rs-a4c52bedef04cfb927f3d7809680fed0425a5125.tar.bz2
sip-rs-a4c52bedef04cfb927f3d7809680fed0425a5125.tar.zst
udp transport
Diffstat (limited to 'src/transport')
-rw-r--r--src/transport/mod.rs1
-rw-r--r--src/transport/tcp.rs3
-rw-r--r--src/transport/udp.rs30
3 files changed, 32 insertions, 2 deletions
diff --git a/src/transport/mod.rs b/src/transport/mod.rs
index 3fa82df..cf49d31 100644
--- a/src/transport/mod.rs
+++ b/src/transport/mod.rs
@@ -2,6 +2,7 @@ use crate::encoding::{request::Request, response::Response};
use anyhow::Result;
pub mod tcp;
+pub mod udp;
#[allow(async_fn_in_trait)]
pub trait Transport {
diff --git a/src/transport/tcp.rs b/src/transport/tcp.rs
index f5986b9..8c0a024 100644
--- a/src/transport/tcp.rs
+++ b/src/transport/tcp.rs
@@ -1,3 +1,4 @@
+use super::Transport;
use crate::encoding::{request::Request, response::Response};
use anyhow::{anyhow, Result};
use log::debug;
@@ -11,8 +12,6 @@ use tokio::{
},
};
-use super::Transport;
-
pub struct TcpTransport {
write: Mutex<BufWriter<OwnedWriteHalf>>,
read: Mutex<Receiver<Response>>,
diff --git a/src/transport/udp.rs b/src/transport/udp.rs
new file mode 100644
index 0000000..c86ce50
--- /dev/null
+++ b/src/transport/udp.rs
@@ -0,0 +1,30 @@
+use super::Transport;
+use crate::encoding::{request::Request, response::Response};
+use 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<Self> {
+ Ok(Self { sock })
+ }
+}
+impl Transport for UdpTransport {
+ async fn recv(&self) -> Result<Response> {
+ let mut buf = [0; 1024];
+ let size = self.sock.recv(&mut buf).await?;
+ let message = String::from_utf8(buf[..size].to_vec())?;
+ debug!("{message}");
+ Response::from_str(message.trim_end())
+ }
+ async fn send(&self, request: Request) -> Result<()> {
+ debug!("-> {request}");
+ self.sock.send(format!("{request}").as_bytes()).await?;
+ Ok(())
+ }
+}