binary_option_tools_core/pocketoption/utils/
connect.rs1use tokio::net::TcpStream;
2use tokio_tungstenite::{
3 connect_async_tls_with_config,
4 tungstenite::{handshake::client::generate_key, http::Request},
5 Connector, MaybeTlsStream, WebSocketStream,
6};
7use url::Url;
8
9use crate::pocketoption::{
10 error::{PocketOptionError, PocketResult},
11 ws::ssid::Ssid,
12};
13
14pub async fn try_connect(
15 ssid: Ssid,
16 url: String,
17) -> PocketResult<WebSocketStream<MaybeTlsStream<TcpStream>>> {
18 let tls_connector = native_tls::TlsConnector::builder().build()?;
19
20 let connector = Connector::NativeTls(tls_connector);
21
22 let user_agent = ssid.user_agent();
23 let t_url = Url::parse(&url)
24 .map_err(|e| PocketOptionError::GeneralParsingError(format!("Error getting host, {e}")))?;
25 let host = t_url
26 .host_str()
27 .ok_or(PocketOptionError::GeneralParsingError(
28 "Host not found".into(),
29 ))?;
30 let request = Request::builder()
31 .uri(url)
32 .header("Origin", "https://pocketoption.com")
33 .header("Cache-Control", "no-cache")
34 .header("User-Agent", user_agent)
35 .header("Upgrade", "websocket")
36 .header("Connection", "upgrade")
37 .header("Sec-Websocket-Key", generate_key())
38 .header("Sec-Websocket-Version", "13")
39 .header("Host", host)
40 .body(())?;
41
42 let (ws, _) = connect_async_tls_with_config(request, None, false, Some(connector)).await?;
43 Ok(ws)
44}