Files
obs-streamer-tools-plugin/core/src/http_common.cpp
T

47 lines
1.7 KiB
C++
Raw Normal View History

/*
streamer-tools OBS Camera Plugin - HTTP helpers shared by all backends
Copyright (C) 2026 CyberCoveLLC <jknapp85@gmail.com>
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 <https://www.gnu.org/licenses/>
*/
#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<unsigned char>(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<char>(c));
} else {
out.push_back('%');
out.push_back(kHex[c >> 4]);
out.push_back(kHex[c & 0x0F]);
}
}
return out;
}
} // namespace stplugin