aboutsummaryrefslogtreecommitdiff
path: root/examples/server.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-07-06 15:43:45 +0200
committermetamuffin <metamuffin@disroot.org>2024-07-06 15:43:45 +0200
commit7177367ae41a5e2d6ed401f60ee1455812dd8ffb (patch)
tree75c89835d03e1a1ccd4e8c930c95310f757b2b3a /examples/server.rs
parent5dd0fafce20ed37fdc97dc96539391ebdebffaff (diff)
downloadsip-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.rs76
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
+*/