diff options
Diffstat (limited to 'light-client/src/network.rs')
-rw-r--r-- | light-client/src/network.rs | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/light-client/src/network.rs b/light-client/src/network.rs index dc6e894f..e3cd1eb5 100644 --- a/light-client/src/network.rs +++ b/light-client/src/network.rs @@ -1,22 +1,56 @@ +use anyhow::Result; use hurrycurry_protocol::{PacketC, PacketS, BINCODE_CONFIG}; use log::warn; use std::{collections::VecDeque, net::TcpStream}; -use tungstenite::{stream::MaybeTlsStream, Message, WebSocket}; +use tungstenite::{ + client::{uri_mode, IntoClientRequest}, + client_tls_with_config, + handshake::client::Request, + stream::{MaybeTlsStream, Mode}, + Message, WebSocket, +}; pub struct Network { sock: WebSocket<MaybeTlsStream<TcpStream>>, - queue_in: VecDeque<PacketC>, - queue_out: VecDeque<PacketS>, + pub queue_in: VecDeque<PacketC>, + pub queue_out: VecDeque<PacketS>, } impl Network { - pub fn connect(addr: &str) -> Self { - let (sock, _resp) = tungstenite::connect(addr).unwrap(); - Self { + pub fn connect(addr: &str) -> Result<Self> { + let (parts, _) = addr.into_client_request().unwrap().into_parts(); + let uri = parts.uri.clone(); + + let mut builder = Request::builder() + .uri(uri.clone()) + .method(parts.method.clone()) + .version(parts.version); + *builder.headers_mut().unwrap() = parts.headers.clone(); + let request = builder.body(()).unwrap(); + + let uri = request.uri(); + let mode = uri_mode(uri)?; + let host = request.uri().host().unwrap(); + let host = if host.starts_with('[') { + &host[1..host.len() - 1] + } else { + host + }; + let port = uri.port_u16().unwrap_or(match mode { + Mode::Plain => 27032, + Mode::Tls => 443, + }); + let stream = TcpStream::connect((host, port))?; + stream.set_nodelay(true).unwrap(); + // stream.set_nonblocking(true).unwrap(); + + let (sock, _) = client_tls_with_config(request, stream, None, None).unwrap(); + + Ok(Self { sock, queue_in: VecDeque::new(), queue_out: VecDeque::new(), - } + }) } pub fn poll(&mut self) { self.queue_in.extend(match self.sock.read() { |