void LibwebsocketsWebsocket::Connect()

in chime-sdk-signaling-cpp/src/websocket/libwebsockets_websocket.cc [188:239]


void LibwebsocketsWebsocket::Connect() {
  // Initialize the client context.
  context_ = lws_create_context(&info_);
  if (!context_) {
    HandleError("lws context initialization failed.");
    return;
  }

  struct lws_client_connect_info connect_info;
  memset(&connect_info, 0, sizeof(connect_info));

  // Parse the url.
  const char* url_temp_path;
  const char* url_protocol;
  std::string url = configuration_.url;
  auto path_start = static_cast<int>(url.find("/control/"));
  std::string path(url.begin() + path_start, url.end());
  if (lws_parse_uri((char*)(url.c_str()), &url_protocol, &connect_info.address, &connect_info.port, &url_temp_path)) {
    HandleError("Could not parse url: " + url);
    return;
  }

  // Set client info and connect the client.
  connect_info.context = context_;
  connect_info.path = path.c_str();
  connect_info.host = connect_info.address;
  connect_info.origin = connect_info.address;
  connect_info.ssl_connection = LCCSCF_USE_SSL;
  connect_info.protocol = configuration_.protocol_name.c_str();
  connect_info.local_protocol_name = configuration_.protocol_name.c_str();
  connect_info.pwsi = &wsi_;
  connect_info.retry_and_idle_policy = &retry_and_idle_policy_;
  connect_info.userdata = this;

  auto lws = lws_client_connect_via_info(&connect_info);
  if (!lws) {
    HandleError("lws_client_connect_via_info failed.");

    // Retry connecting according to the retry policy.
    if (lws_retry_sul_schedule(context_, /* Thread Service Index */ 0, &(retry_connect_.sul), &retry_and_idle_policy_,
                               RetryConnect, &connection_retry_count_)) {
      lwsl_err("Connection attempts exhausted.\n");
      return;
    }
  }

  // TODO: Figure out why it's necessary to manually set SSL certs.
  auto lws_vhost = lws_get_vhost(lws);
  for (const auto& all_prod_cert : all_prod_certs) {
    lws_tls_client_vhost_extra_cert_mem(lws_vhost, all_prod_cert.cert, all_prod_cert.len);
  }
}