#include "URLParser.h" namespace bell { #ifdef BELL_DISABLE_REGEX void URLParser::parse(const char* url, std::vector& 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