#ifndef INCLUDE_CCAPI_CPP_CCAPI_WS_CONNECTION_H_ #define INCLUDE_CCAPI_CPP_CCAPI_WS_CONNECTION_H_ #ifdef CCAPI_LEGACY_USE_WEBSOCKETPP #include #include "ccapi_cpp/ccapi_logger.h" #include "ccapi_cpp/ccapi_subscription.h" namespace wspp = websocketpp; namespace ccapi { /** * This class represents a TCP socket connection for the websocket API. */ class WsConnection CCAPI_FINAL { public: WsConnection(std::string url, std::string group, std::vector subscriptionList, std::map credential) : url(url), group(group), subscriptionList(subscriptionList), credential(credential) { this->assignDummyId(); } WsConnection() {} void assignDummyId() { this->id = this->url + "||" + this->group + "||" + ccapi::toString(this->subscriptionList) + "||" + ccapi::toString(this->credential); this->hdl.reset(); } std::string toString() const { std::map shortCredential; for (const auto& x : credential) { shortCredential.insert(std::make_pair(x.first, UtilString::firstNCharacter(x.second, CCAPI_CREDENTIAL_DISPLAY_LENGTH))); } std::string output = "WsConnection [id = " + id + ", url = " + url + ", group = " + group + ", subscriptionList = " + ccapi::toString(subscriptionList) + ", credential = " + ccapi::toString(shortCredential) + ", status = " + statusToString(status) + ", headers = " + ccapi::toString(headers) + "]"; return output; } enum class Status { UNKNOWN, CONNECTING, OPEN, FAILED, CLOSING, CLOSED, }; static std::string statusToString(Status status) { std::string output; switch (status) { case Status::UNKNOWN: output = "UNKNOWN"; break; case Status::CONNECTING: output = "CONNECTING"; break; case Status::OPEN: output = "OPEN"; break; case Status::FAILED: output = "FAILED"; break; case Status::CLOSING: output = "CLOSING"; break; case Status::CLOSED: output = "CLOSED"; break; default: CCAPI_LOGGER_FATAL(CCAPI_UNSUPPORTED_VALUE); } return output; } std::string id; std::string url; std::string group; std::vector subscriptionList; Status status{Status::UNKNOWN}; wspp::connection_hdl hdl = wspp::lib::weak_ptr(); std::map headers; std::map credential; }; } /* namespace ccapi */ #else #include #include "ccapi_cpp/ccapi_logger.h" #include "ccapi_cpp/ccapi_subscription.h" namespace ccapi { /** * This class represents a TCP socket connection for the websocket API. */ class WsConnection CCAPI_FINAL { public: WsConnection(std::string url, std::string group, std::vector subscriptionList, std::map credential, std::shared_ptr > > streamPtr) : url(url), group(group), subscriptionList(subscriptionList), credential(credential), streamPtr(streamPtr) { this->id = this->url + "||" + this->group + "||" + ccapi::toString(this->subscriptionList) + "||" + ccapi::toString(this->credential); this->correlationIdList.reserve(subscriptionList.size()); std::transform(subscriptionList.cbegin(), subscriptionList.cend(), std::back_inserter(this->correlationIdList), [](Subscription subscription) { return subscription.getCorrelationId(); }); this->setUrlParts(); } WsConnection() {} std::string toString() const { std::map shortCredential; for (const auto& x : credential) { shortCredential.insert(std::make_pair(x.first, UtilString::firstNCharacter(x.second, CCAPI_CREDENTIAL_DISPLAY_LENGTH))); } std::ostringstream oss; oss << streamPtr; std::string output = "WsConnection [id = " + id + ", url = " + url + ", group = " + group + ", subscriptionList = " + ccapi::toString(subscriptionList) + ", credential = " + ccapi::toString(shortCredential) + ", status = " + statusToString(status) + ", headers = " + ccapi::toString(headers) + ", streamPtr = " + oss.str() + ", remoteCloseCode = " + std::to_string(remoteCloseCode) + ", remoteCloseReason = " + std::string(remoteCloseReason.reason.c_str()) + ", hostHttpHeaderValue = " + ccapi::toString(hostHttpHeaderValue) + ", path = " + ccapi::toString(path) + ", host = " + ccapi::toString(host) + ", port = " + ccapi::toString(port) + "]"; return output; } enum class Status { UNKNOWN, CONNECTING, OPEN, FAILED, CLOSING, CLOSED, }; static std::string statusToString(Status status) { std::string output; switch (status) { case Status::UNKNOWN: output = "UNKNOWN"; break; case Status::CONNECTING: output = "CONNECTING"; break; case Status::OPEN: output = "OPEN"; break; case Status::FAILED: output = "FAILED"; break; case Status::CLOSING: output = "CLOSING"; break; case Status::CLOSED: output = "CLOSED"; break; default: CCAPI_LOGGER_FATAL(CCAPI_UNSUPPORTED_VALUE); } return output; } std::string getUrl() const { return url; } void setUrl(const std::string& url) { this->url = url; this->setUrlParts(); } void setUrlParts() { auto splitted1 = UtilString::split(url, "://"); if (splitted1.size() >= 2) { auto foundSlash = splitted1.at(1).find_first_of('/'); auto foundQuestionMark = splitted1.at(1).find_first_of('?'); if (foundSlash == std::string::npos && foundQuestionMark == std::string::npos) { this->path = "/"; } else if (foundSlash == std::string::npos && foundQuestionMark != std::string::npos) { this->path = "/" + splitted1.at(1).substr(foundQuestionMark); } else if (foundSlash != std::string::npos && foundQuestionMark == std::string::npos) { this->path = splitted1.at(1).substr(foundSlash); } else { this->path = splitted1.at(1).substr(foundSlash); } auto splitted2 = UtilString::split(UtilString::split(splitted1.at(1), "/").at(0), ":"); this->host = splitted2.at(0); if (splitted2.size() == 2) { this->port = splitted2.at(1); } else { if (splitted1.at(0) == "https" || splitted1.at(0) == "wss") { this->port = CCAPI_HTTPS_PORT_DEFAULT; } else { this->port = CCAPI_HTTP_PORT_DEFAULT; } } } } void appendUrlPart(const std::string& urlPart) { this->url += urlPart; this->setUrlParts(); } std::string id; std::string group; std::vector subscriptionList; std::vector correlationIdList; Status status{Status::UNKNOWN}; std::map headers; std::map credential; std::shared_ptr > > streamPtr; beast::websocket::close_code remoteCloseCode{}; beast::websocket::close_reason remoteCloseReason{}; std::string hostHttpHeaderValue; std::string path; std::string host; std::string port; #ifndef CCAPI_EXPOSE_INTERNAL private: #endif std::string url; }; } /* namespace ccapi */ #endif #endif // INCLUDE_CCAPI_CPP_CCAPI_WS_CONNECTION_H_