/* streamer-tools OBS Camera Plugin - HTTP helpers shared by all backends Copyright (C) 2026 CyberCoveLLC This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see */ #include "stplugin/http.h" namespace stplugin { // Hand-rolled rather than curl_easy_escape so the WinHTTP backend gets the // same behaviour, and so this is testable without a live HTTP client. // Unreserved set per RFC 3986 section 2.3. std::string urlEncode(const std::string &value) { static const char *kHex = "0123456789ABCDEF"; std::string out; out.reserve(value.size()); for (const char raw : value) { const unsigned char c = static_cast(raw); const bool unreserved = (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '-' || c == '_' || c == '.' || c == '~'; if (unreserved) { out.push_back(static_cast(c)); } else { out.push_back('%'); out.push_back(kHex[c >> 4]); out.push_back(kHex[c & 0x0F]); } } return out; } } // namespace stplugin