| 2669 | } |
| 2670 | |
| 2671 | inline std::string encode_url(const std::string &s) { |
| 2672 | std::string result; |
| 2673 | result.reserve(s.size()); |
| 2674 | |
| 2675 | for (size_t i = 0; s[i]; i++) { |
| 2676 | switch (s[i]) { |
| 2677 | case ' ': result += "%20"; break; |
| 2678 | case '+': result += "%2B"; break; |
| 2679 | case '\r': result += "%0D"; break; |
| 2680 | case '\n': result += "%0A"; break; |
| 2681 | case '\'': result += "%27"; break; |
| 2682 | case ',': result += "%2C"; break; |
| 2683 | // case ':': result += "%3A"; break; // ok? probably... |
| 2684 | case ';': result += "%3B"; break; |
| 2685 | default: |
| 2686 | auto c = static_cast<uint8_t>(s[i]); |
| 2687 | if (c >= 0x80) { |
| 2688 | result += '%'; |
| 2689 | char hex[4]; |
| 2690 | auto len = snprintf(hex, sizeof(hex) - 1, "%02X", c); |
| 2691 | assert(len == 2); |
| 2692 | result.append(hex, static_cast<size_t>(len)); |
| 2693 | } else { |
| 2694 | result += s[i]; |
| 2695 | } |
| 2696 | break; |
| 2697 | } |
| 2698 | } |
| 2699 | |
| 2700 | return result; |
| 2701 | } |
| 2702 | |
| 2703 | inline std::string decode_url(const std::string &s, |
| 2704 | bool convert_plus_to_space) { |
no test coverage detected