85 {
86 std::shared_ptr<web::http::client::tools::EventSource> eventSource;
87
88 static const std::regex re(
89 R"(^(?:rfcomm://)(?![^/]*@)((?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{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])?)*)"
90 R"(?::([1-9]|[12]\d|30))?([^?#]*)(\?[^#]*)?(?:#.*)?$)",
91 std::regex::ECMAScript | std::regex::icase);
92
93 std::smatch match;
94 if (std::regex_match(url, match, re)) {
95
96
97
98
99
100
101 const std::string scheme = "rfcomm";
102 const std::string addr = match[1].str();
103 const uint8_t chan = match[2].matched ? static_cast<uint8_t>(std::stoi(match[2].str())) : static_cast<uint16_t>(1);
104 const std::string path = match[3].matched ? match[3].str() : "/";
105 const std::string query = match[4].matched ? match[4].str() : "";
106
107 eventSource = std::make_shared<class EventSource>(scheme,
net::rc::SocketAddress(addr, chan), path + query);
108 } else {
109 LOG(ERROR) << "EventSource RFCOMM url not accepted: " << url;
110 }
111
112 return eventSource;
113 }