aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2020-10-10 17:18:31 +0200
committerGustav Sörnäs <gustav@sornas.net>2020-10-10 17:18:31 +0200
commite88e8df4d464e7c937e64ea68701a7c155bd3f1d (patch)
tree428952fc5fb884106f82bca29735734fce270f5a
parentf1338cb1e2c830f1049a99b4a7b1eab3adc7087f (diff)
downloadmum-e88e8df4d464e7c937e64ea68701a7c155bd3f1d.tar.gz
create network.rs and move code
Co-authored-by: Eskil Queseth <eskilq@kth.se>
-rw-r--r--mumd/Cargo.toml1
-rw-r--r--mumd/src/main.rs25
-rw-r--r--mumd/src/network.rs40
3 files changed, 43 insertions, 23 deletions
diff --git a/mumd/Cargo.toml b/mumd/Cargo.toml
index bb68525..5573453 100644
--- a/mumd/Cargo.toml
+++ b/mumd/Cargo.toml
@@ -14,6 +14,7 @@ clap = "2.33"
mumble-protocol = "0.3"
cpal = { git = "https://github.com/RustAudio/cpal" }
opus = "0.2"
+futures-util = "0.3"
bytes = "0.5"
byteorder = "1"
diff --git a/mumd/src/main.rs b/mumd/src/main.rs
index 12e467d..c8cf68b 100644
--- a/mumd/src/main.rs
+++ b/mumd/src/main.rs
@@ -1,4 +1,5 @@
mod audio;
+mod network;
use crate::audio::Audio;
use argparse::ArgumentParser;
@@ -12,7 +13,6 @@ use futures::StreamExt;
use futures::SinkExt;
use mumble_protocol::control::msgs;
-use mumble_protocol::control::ClientControlCodec;
use mumble_protocol::control::ControlPacket;
use mumble_protocol::crypt::ClientCryptState;
use mumble_protocol::voice::VoicePacket;
@@ -25,10 +25,7 @@ use std::net::Ipv6Addr;
use std::net::SocketAddr;
use std::net::ToSocketAddrs;
-use tokio::net::TcpStream;
use tokio::net::UdpSocket;
-use tokio_tls::TlsConnector;
-use tokio_util::codec::Decoder;
use tokio_util::udp::UdpFramed;
use tokio::time::{self, Duration};
@@ -50,25 +47,7 @@ async fn connect(
// Wrap crypt_state_sender in Option, so we can call it only once
let mut crypt_state_sender = Some(crypt_state_sender);
- // Connect to server via TCP
- let stream = TcpStream::connect(&server_addr).await.expect("Failed to connect to server:");
- println!("TCP connected..");
-
- // Wrap the connection in TLS
- let mut builder = native_tls::TlsConnector::builder();
- builder.danger_accept_invalid_certs(accept_invalid_cert);
- let connector: TlsConnector = builder
- .build()
- .expect("Failed to create TLS connector")
- .into();
- let tls_stream = connector
- .connect(&server_host, stream)
- .await
- .expect("Failed to connect TLS: {}");
- println!("TLS connected..");
-
- // Wrap the TLS stream with Mumble's client-side control-channel codec
- let (sink, mut stream) = ClientControlCodec::new().framed(tls_stream).split();
+ let (sink, mut stream) = network::connect_tcp(server_addr, server_host, accept_invalid_cert).await;
let sink = Arc::new(Mutex::new(sink));
// Handshake (omitting `Version` message for brevity)
diff --git a/mumd/src/network.rs b/mumd/src/network.rs
new file mode 100644
index 0000000..6aec343
--- /dev/null
+++ b/mumd/src/network.rs
@@ -0,0 +1,40 @@
+use futures::StreamExt;
+use futures_util::stream::{SplitSink, SplitStream};
+use mumble_protocol::{Serverbound, Clientbound};
+use mumble_protocol::control::ClientControlCodec;
+use mumble_protocol::control::ControlCodec;
+use mumble_protocol::control::ControlPacket;
+use std::net::SocketAddr;
+use tokio::net::TcpStream;
+use tokio_tls::TlsConnector;
+use tokio_tls::TlsStream;
+use tokio_util::codec::Decoder;
+use tokio_util::codec::Framed;
+
+pub async fn connect_tcp(
+ server_addr: SocketAddr,
+ server_host: String,
+ accept_invalid_cert: bool,
+) -> (
+ SplitSink<Framed<TlsStream<TcpStream>, ControlCodec<Serverbound, Clientbound>>, ControlPacket<Serverbound>>,
+ SplitStream<Framed<TlsStream<TcpStream>, ControlCodec<Serverbound, Clientbound>>>
+) {
+
+ let stream = TcpStream::connect(&server_addr).await.expect("failed to connect to server:");
+ println!("TCP connected");
+
+ let mut builder = native_tls::TlsConnector::builder();
+ builder.danger_accept_invalid_certs(accept_invalid_cert);
+ let connector: TlsConnector = builder
+ .build()
+ .expect("failed to create TLS connector")
+ .into();
+ let tls_stream = connector
+ .connect(&server_host, stream)
+ .await
+ .expect("failed to connect TLS: {}");
+ println!("TLS connected");
+
+ // Wrap the TLS stream with Mumble's client-side control-channel codec
+ ClientControlCodec::new().framed(tls_stream).split()
+}