tokio_tungstenite/
connect.rs1use tokio::net::TcpStream;
3
4use tungstenite::{
5 error::{Error, UrlError},
6 handshake::client::{Request, Response},
7 protocol::WebSocketConfig,
8};
9
10use crate::{domain, stream::MaybeTlsStream, Connector, IntoClientRequest, WebSocketStream};
11
12pub async fn connect_async<R>(
32 request: R,
33) -> Result<(WebSocketStream<MaybeTlsStream<TcpStream>>, Response), Error>
34where
35 R: IntoClientRequest + Unpin,
36{
37 connect_async_with_config(request, None, false).await
38}
39
40pub async fn connect_async_with_config<R>(
45 request: R,
46 config: Option<WebSocketConfig>,
47 disable_nagle: bool,
48) -> Result<(WebSocketStream<MaybeTlsStream<TcpStream>>, Response), Error>
49where
50 R: IntoClientRequest + Unpin,
51{
52 connect(request.into_client_request()?, config, disable_nagle, None).await
53}
54
55#[cfg(any(feature = "native-tls", feature = "__rustls-tls"))]
61pub async fn connect_async_tls_with_config<R>(
62 request: R,
63 config: Option<WebSocketConfig>,
64 disable_nagle: bool,
65 connector: Option<Connector>,
66) -> Result<(WebSocketStream<MaybeTlsStream<TcpStream>>, Response), Error>
67where
68 R: IntoClientRequest + Unpin,
69{
70 connect(request.into_client_request()?, config, disable_nagle, connector).await
71}
72
73async fn connect(
74 request: Request,
75 config: Option<WebSocketConfig>,
76 disable_nagle: bool,
77 connector: Option<Connector>,
78) -> Result<(WebSocketStream<MaybeTlsStream<TcpStream>>, Response), Error> {
79 let domain = domain(&request)?;
80 let port = request
81 .uri()
82 .port_u16()
83 .or_else(|| match request.uri().scheme_str() {
84 Some("wss") => Some(443),
85 Some("ws") => Some(80),
86 _ => None,
87 })
88 .ok_or(Error::Url(UrlError::UnsupportedUrlScheme))?;
89
90 let addr = format!("{domain}:{port}");
91 let socket = TcpStream::connect(addr).await.map_err(Error::Io)?;
92
93 if disable_nagle {
94 socket.set_nodelay(true)?;
95 }
96
97 crate::tls::client_async_tls_with_config(request, socket, config, connector).await
98}