aboutsummaryrefslogtreecommitdiff
path: root/sip/examples/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'sip/examples/server.rs')
-rw-r--r--sip/examples/server.rs83
1 files changed, 83 insertions, 0 deletions
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: <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
+*/