84 {
85 std::shared_ptr<web::http::client::tools::EventSource> eventSource;
86
87 static const std::regex re(
88 R"(^(?:(https?)://)?(?![^/]*@)((?:(?:25[0-5]|2[0-4]\d|1?\d{1,2})\.){3}(?:25[0-5]|2[0-4]\d|1?\d{1,2})|[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*)(?::([0-9]{1,5}))?([^?#]*)(\?[^#]*)?(?:#.*)?$)",
89 std::regex::ECMAScript | std::regex::icase);
90
91 std::smatch match;
92 if (std::regex_match(url, match, re)) {
93
94
95
96
97
98
99 const std::string& scheme = match[1].matched ? match[1].str() : "http";
100 const std::string& host = match[2].str();
101 const uint16_t port = match[3].matched ? static_cast<uint16_t>(std::stoi(match[3].str())) : static_cast<uint16_t>(80);
102 const std::string& path = (match[4].matched ? match[4].str() : "/");
103 const std::string& query = (match[5].matched ? match[5].str() : "");
104
105 if (scheme == "http") {
107 } else {
108 LOG(ERROR) << "Scheme not valid: " << scheme;
109 }
110 } else {
111 LOG(ERROR) << "EventSource url not accepted: " << url;
112 }
113
114 return eventSource;
115 }