BaseHTTPServer.cpp0 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "BaseHTTPServer.h"
  2. #include <sstream>
  3. unsigned char bell::BaseHTTPServer::h2int(char c)
  4. {
  5. if (c >= '0' && c <= '9')
  6. {
  7. return ((unsigned char)c - '0');
  8. }
  9. if (c >= 'a' && c <= 'f')
  10. {
  11. return ((unsigned char)c - 'a' + 10);
  12. }
  13. if (c >= 'A' && c <= 'F')
  14. {
  15. return ((unsigned char)c - 'A' + 10);
  16. }
  17. return (0);
  18. }
  19. std::string bell::BaseHTTPServer::urlDecode(std::string str)
  20. {
  21. std::string encodedString = "";
  22. char c;
  23. char code0;
  24. char code1;
  25. for (int i = 0; i < str.length(); i++)
  26. {
  27. c = str[i];
  28. if (c == '+')
  29. {
  30. encodedString += ' ';
  31. }
  32. else if (c == '%')
  33. {
  34. i++;
  35. code0 = str[i];
  36. i++;
  37. code1 = str[i];
  38. c = (h2int(code0) << 4) | h2int(code1);
  39. encodedString += c;
  40. }
  41. else
  42. {
  43. encodedString += c;
  44. }
  45. }
  46. return encodedString;
  47. }
  48. std::vector<std::string> bell::BaseHTTPServer::splitUrl(const std::string &url, char delimiter)
  49. {
  50. std::stringstream ssb(url);
  51. std::string segment;
  52. std::vector<std::string> seglist;
  53. while (std::getline(ssb, segment, delimiter))
  54. {
  55. seglist.push_back(segment);
  56. }
  57. return seglist;
  58. }
  59. std::map<std::string, std::string> bell::BaseHTTPServer::parseQueryString(const std::string &queryString)
  60. {
  61. std::map<std::string, std::string> query;
  62. auto prefixedString = "&" + queryString;
  63. while (prefixedString.find("&") != std::string::npos)
  64. {
  65. auto keyStart = prefixedString.find("&");
  66. auto keyEnd = prefixedString.find("=");
  67. // Find second occurence of "&" in prefixedString
  68. auto valueEnd = prefixedString.find("&", keyStart + 1);
  69. if (valueEnd == std::string::npos)
  70. {
  71. valueEnd = prefixedString.size();
  72. }
  73. auto key = prefixedString.substr(keyStart + 1, keyEnd - 1);
  74. auto value = prefixedString.substr(keyEnd + 1, valueEnd - keyEnd - 1);
  75. query[key] = urlDecode(value);
  76. prefixedString = prefixedString.substr(valueEnd);
  77. }
  78. return query;
  79. }