#include "BaseHTTPServer.h" #include unsigned char bell::BaseHTTPServer::h2int(char c) { if (c >= '0' && c <= '9') { return ((unsigned char)c - '0'); } if (c >= 'a' && c <= 'f') { return ((unsigned char)c - 'a' + 10); } if (c >= 'A' && c <= 'F') { return ((unsigned char)c - 'A' + 10); } return (0); } std::string bell::BaseHTTPServer::urlDecode(std::string str) { std::string encodedString = ""; char c; char code0; char code1; for (int i = 0; i < str.length(); i++) { c = str[i]; if (c == '+') { encodedString += ' '; } else if (c == '%') { i++; code0 = str[i]; i++; code1 = str[i]; c = (h2int(code0) << 4) | h2int(code1); encodedString += c; } else { encodedString += c; } } return encodedString; } std::vector bell::BaseHTTPServer::splitUrl(const std::string &url, char delimiter) { std::stringstream ssb(url); std::string segment; std::vector seglist; while (std::getline(ssb, segment, delimiter)) { seglist.push_back(segment); } return seglist; } std::map bell::BaseHTTPServer::parseQueryString(const std::string &queryString) { std::map query; auto prefixedString = "&" + queryString; while (prefixedString.find("&") != std::string::npos) { auto keyStart = prefixedString.find("&"); auto keyEnd = prefixedString.find("="); // Find second occurence of "&" in prefixedString auto valueEnd = prefixedString.find("&", keyStart + 1); if (valueEnd == std::string::npos) { valueEnd = prefixedString.size(); } auto key = prefixedString.substr(keyStart + 1, keyEnd - 1); auto value = prefixedString.substr(keyEnd + 1, valueEnd - keyEnd - 1); query[key] = urlDecode(value); prefixedString = prefixedString.substr(valueEnd); } return query; }