Files
squeezelite-esp32/components/spotify/cspot/bell/main/io/URLParser.cpp
2023-05-06 23:50:26 +02:00

54 lines
1.4 KiB
C++

#include "URLParser.h"
namespace bell {
#ifdef BELL_DISABLE_REGEX
void URLParser::parse(const char* url, std::vector<std::string>& match) {
match[0] = url;
char scratch[512];
/* Parsing the following (http|https://[host][/path][?query]#hash] as in regex
* below. This needs to be changed if you update that regex */
// get the schema
if (sscanf(url, "%[^:]:/", scratch) > 0)
match[1] = scratch;
// get the host
if (sscanf(url, "htt%*[^:]://%512[^/#?]", scratch) > 0)
match[2] = scratch;
// get the path
url = strstr(url, match[2].c_str()) + match[2].size();
if (sscanf(url, "/%512[^?]", scratch) > 0)
match[3] = scratch;
else if (*url && *url != '?' && *url != '#')
url++;
// get the query
if (match[3].size())
url += match[3].size() + 1;
if (sscanf(url, "?%512[^#]", scratch) > 0)
match[4] = scratch;
// get the hash
if (match[4].size())
url += match[4].size() + 1;
if (sscanf(url, "#%512s", scratch) > 0)
match[5] = scratch;
// fix the acquired items
match[3] = "/" + match[3];
if (match[4].size())
match[4] = "?" + match[4];
// need at least schema and host
if (match[1].size() == 0 || match[2].size() == 0)
match.clear();
}
#else
const std::regex URLParser::urlParseRegex = std::regex(
"^(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(\\?(?:[^#]*))?(#(?:.*))?");
#endif
} // namespace bell