diff options
author | metamuffin <metamuffin@disroot.org> | 2024-07-06 15:43:45 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-07-06 15:43:45 +0200 |
commit | 7177367ae41a5e2d6ed401f60ee1455812dd8ffb (patch) | |
tree | 75c89835d03e1a1ccd4e8c930c95310f757b2b3a /examples/server.rs | |
parent | 5dd0fafce20ed37fdc97dc96539391ebdebffaff (diff) | |
download | sip-rs-7177367ae41a5e2d6ed401f60ee1455812dd8ffb.tar sip-rs-7177367ae41a5e2d6ed401f60ee1455812dd8ffb.tar.bz2 sip-rs-7177367ae41a5e2d6ed401f60ee1455812dd8ffb.tar.zst |
phone is ringing
Diffstat (limited to 'examples/server.rs')
-rw-r--r-- | examples/server.rs | 76 |
1 files changed, 67 insertions, 9 deletions
diff --git a/examples/server.rs b/examples/server.rs index 5e294b0..60a2b33 100644 --- a/examples/server.rs +++ b/examples/server.rs @@ -1,20 +1,78 @@ +use std::net::SocketAddr; + use anyhow::Result; -use log::info; -use sip::{transaction::TransactionUser, transport::tcp::TcpTransport}; -use tokio::net::TcpListener; +use log::{info, warn}; +use sip::{ + encoding::{ + headermap::HeaderMap, + headers::{Contact, ContentLength, From, To, UserAgent}, + method::Method, + response::Response, + status::Status, + }, + transaction::TransactionUser, + transport::tcp::TcpTransport, +}; +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!("connection from {addr}"); - let transport = TcpTransport::new(stream).await?; - let tu = TransactionUser::new(transport); + info!("connect {addr}"); - let req = tu.process_incoming().await?; + 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()?; - Ok(()) + tu.respond( + &req, + Response { + status: Status::Ok, + headers: HeaderMap::new() + .add(Contact(format!("<sip:{username}@{addr}>;expires=600"))) + .add(From(to.0)) + .add(To(from.0)) + .add(UserAgent("siptest v0.1.0".to_string())) + .add(ContentLength(0)), + }, + ) + .await?; + } + } } + +/* +[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: <sip:metatest-0x5e11f89f7900@198.18.1.135:40708>;expires=379;+sip.instance="<urn:uuid:9b2421ef-43ed-3b3b-9181-607ba5c13fb9>" + Contact: <sip:metatest-0x5e11f89f7900@198.18.1.135:47412>;expires=411 + Contact: <sip:metatest-0x5e11f89f7900@198.18.1.135:52125>;expires=600 + To: <sip:metatest@198.18.0.220>;tag=81756f4e + From: <sip:metatest@198.18.0.220>;tag=-AK4OkphTFVZv50h + Call-ID: U3Fyb6vT1BhWxiKG + CSeq: 1 REGISTER + User-Agent: AGFEO SIP V3.00.15 n (MAC=00094070069C) + Content-Length: 0 +*/ |