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);
}
}