Skip to main content

binary_option_tools_core/pocketoption/utils/
connect.rs

1use 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}