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/examples/server.rs | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 sip/examples/server.rs (limited to 'sip/examples/server.rs') diff --git a/sip/examples/server.rs b/sip/examples/server.rs new file mode 100644 index 0000000..02c06b4 --- /dev/null +++ b/sip/examples/server.rs @@ -0,0 +1,83 @@ +use anyhow::Result; +use log::{info, warn}; +use sip::{ + encoding::{ + headermap::HeaderMap, + headers::{Contact, From, To, UserAgent, Via}, + method::Method, + response::Response, + status::Status, + }, + transaction::TransactionUser, + transport::tcp::TcpTransport, +}; +use std::net::SocketAddr; +use tokio::{ + net::{TcpListener, TcpStream}, + spawn, +}; + +#[tokio::main] +async fn main() -> Result<()> { + env_logger::init_from_env("LOG"); + let listener = TcpListener::bind("0.0.0.0:5060").await?; + info!("tcp listener bound to {}", listener.local_addr().unwrap()); + + loop { + let (stream, addr) = listener.accept().await?; + info!("connect {addr}"); + + spawn(async move { + if let Err(e) = handle_client(stream, addr).await { + warn!("client error: {e}") + } + info!("disconnect {addr}") + }); + } +} + +async fn handle_client(stream: TcpStream, addr: SocketAddr) -> Result<()> { + let transport = TcpTransport::new(stream).await?; + let tu = TransactionUser::new(transport); + loop { + let req = tu.process_incoming().await?; + + if req.method == Method::Register { + let from: From = req.headers.get_res()?; + let to: To = req.headers.get_res()?; + let via: Via = req.headers.get_res()?; + let contact: Contact = req.headers.get_res()?; + info!("Registered {}", contact.uri.localpart.as_ref().unwrap()); + + tu.respond( + &req, + Response { + status: Status::Ok, + headers: HeaderMap::new() + .add(contact) + .add(via) + .add(to) + .add(from) + .add(UserAgent("siptest v0.1.0".to_string())), + body: String::new(), + }, + ) + .await?; + } + if req.method == Method::Invite {} + } +} + +/* +[2024-07-05T22:22:40Z DEBUG sip::transport::udp] SIP/2.0 200 OK + Via: SIP/2.0/UDP 198.18.1.135:52125;branch=Uz7r7ysvrS91q9j9;rport=52125 + Contact: ;expires=379;+sip.instance="" + Contact: ;expires=411 + Contact: ;expires=600 + To: ;tag=81756f4e + From: ;tag=-AK4OkphTFVZv50h + Call-ID: U3Fyb6vT1BhWxiKG + CSeq: 1 REGISTER + User-Agent: AGFEO SIP V3.00.15 n (MAC=00094070069C) + Content-Length: 0 +*/ -- cgit v1.2.3-70-g09d2