blob: 6aec343e05ad0330c023c4eed7557ae66922f13d (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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()
}
|