mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-07-02 09:33:33 +00:00
obs-webrtc: Do not use curl_easy_nextheader
API not available in Ubuntu 22.04 which ships 7.81 this API was first available in 7.83
This commit is contained in:
parent
5db2ff9413
commit
512db59c44
|
@ -362,7 +362,7 @@ bool WHIPOutput::Connect()
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string read_buffer;
|
std::string read_buffer;
|
||||||
std::vector<std::string> location_headers;
|
std::vector<std::string> http_headers;
|
||||||
|
|
||||||
auto offer_sdp =
|
auto offer_sdp =
|
||||||
std::string(peer_connection->localDescription().value());
|
std::string(peer_connection->localDescription().value());
|
||||||
|
@ -379,9 +379,8 @@ bool WHIPOutput::Connect()
|
||||||
CURL *c = curl_easy_init();
|
CURL *c = curl_easy_init();
|
||||||
curl_easy_setopt(c, CURLOPT_WRITEFUNCTION, curl_writefunction);
|
curl_easy_setopt(c, CURLOPT_WRITEFUNCTION, curl_writefunction);
|
||||||
curl_easy_setopt(c, CURLOPT_WRITEDATA, (void *)&read_buffer);
|
curl_easy_setopt(c, CURLOPT_WRITEDATA, (void *)&read_buffer);
|
||||||
curl_easy_setopt(c, CURLOPT_HEADERFUNCTION,
|
curl_easy_setopt(c, CURLOPT_HEADERFUNCTION, curl_header_function);
|
||||||
curl_header_location_function);
|
curl_easy_setopt(c, CURLOPT_HEADERDATA, (void *)&http_headers);
|
||||||
curl_easy_setopt(c, CURLOPT_HEADERDATA, (void *)&location_headers);
|
|
||||||
curl_easy_setopt(c, CURLOPT_HTTPHEADER, headers);
|
curl_easy_setopt(c, CURLOPT_HTTPHEADER, headers);
|
||||||
curl_easy_setopt(c, CURLOPT_URL, endpoint_url.c_str());
|
curl_easy_setopt(c, CURLOPT_URL, endpoint_url.c_str());
|
||||||
curl_easy_setopt(c, CURLOPT_POST, 1L);
|
curl_easy_setopt(c, CURLOPT_POST, 1L);
|
||||||
|
@ -428,7 +427,18 @@ bool WHIPOutput::Connect()
|
||||||
long redirect_count = 0;
|
long redirect_count = 0;
|
||||||
curl_easy_getinfo(c, CURLINFO_REDIRECT_COUNT, &redirect_count);
|
curl_easy_getinfo(c, CURLINFO_REDIRECT_COUNT, &redirect_count);
|
||||||
|
|
||||||
if (location_headers.size() < static_cast<size_t>(redirect_count) + 1) {
|
std::string last_location_header;
|
||||||
|
size_t location_header_count = 0;
|
||||||
|
for (auto &http_header : http_headers) {
|
||||||
|
auto value = value_for_header("location", http_header);
|
||||||
|
if (value.empty())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
location_header_count++;
|
||||||
|
last_location_header = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (location_header_count < static_cast<size_t>(redirect_count) + 1) {
|
||||||
do_log(LOG_ERROR,
|
do_log(LOG_ERROR,
|
||||||
"WHIP server did not provide a resource URL via the Location header");
|
"WHIP server did not provide a resource URL via the Location header");
|
||||||
cleanup();
|
cleanup();
|
||||||
|
@ -437,25 +447,21 @@ bool WHIPOutput::Connect()
|
||||||
}
|
}
|
||||||
|
|
||||||
CURLU *url_builder = curl_url();
|
CURLU *url_builder = curl_url();
|
||||||
auto last_location_header = location_headers.back();
|
|
||||||
|
|
||||||
// Parse Link headers to extract STUN/TURN server configuration URLs
|
// Parse Link headers to extract STUN/TURN server configuration URLs
|
||||||
struct curl_header *prev = nullptr;
|
|
||||||
struct curl_header *h = nullptr;
|
|
||||||
std::vector<rtc::IceServer> iceServers;
|
std::vector<rtc::IceServer> iceServers;
|
||||||
while ((h = curl_easy_nextheader(c, CURLH_HEADER, 0, prev))) {
|
for (auto &http_header : http_headers) {
|
||||||
if (astrcmpi("Link", h->name) == 0) {
|
auto value = value_for_header("link", http_header);
|
||||||
auto value = std::string(h->value);
|
if (value.empty())
|
||||||
// Parse multiple links separated by ','
|
continue;
|
||||||
for (auto end = value.find(",");
|
|
||||||
end != std::string::npos; end = value.find(",")) {
|
// Parse multiple links separated by ','
|
||||||
this->ParseLinkHeader(value.substr(0, end),
|
for (auto end = value.find(","); end != std::string::npos;
|
||||||
iceServers);
|
end = value.find(",")) {
|
||||||
value = value.substr(end + 1);
|
this->ParseLinkHeader(value.substr(0, end), iceServers);
|
||||||
}
|
value = value.substr(end + 1);
|
||||||
this->ParseLinkHeader(value, iceServers);
|
|
||||||
}
|
}
|
||||||
prev = h;
|
this->ParseLinkHeader(value, iceServers);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If Location header doesn't start with `http` it is a relative URL.
|
// If Location header doesn't start with `http` it is a relative URL.
|
||||||
|
|
|
@ -26,6 +26,22 @@ static std::string trim_string(const std::string &source)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string value_for_header(const std::string &header,
|
||||||
|
const std::string &val)
|
||||||
|
{
|
||||||
|
if (val.size() <= header.size() ||
|
||||||
|
astrcmpi_n(header.c_str(), val.c_str(), header.size()) != 0) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
auto delimiter = val.find_first_of(" ");
|
||||||
|
if (delimiter == std::string::npos) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return val.substr(delimiter + 1);
|
||||||
|
}
|
||||||
|
|
||||||
static size_t curl_writefunction(char *data, size_t size, size_t nmemb,
|
static size_t curl_writefunction(char *data, size_t size, size_t nmemb,
|
||||||
void *priv_data)
|
void *priv_data)
|
||||||
{
|
{
|
||||||
|
@ -37,28 +53,12 @@ static size_t curl_writefunction(char *data, size_t size, size_t nmemb,
|
||||||
return real_size;
|
return real_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define LOCATION_HEADER_LENGTH 10
|
static size_t curl_header_function(char *data, size_t size, size_t nmemb,
|
||||||
|
void *priv_data)
|
||||||
static size_t curl_header_location_function(char *data, size_t size,
|
|
||||||
size_t nmemb, void *priv_data)
|
|
||||||
{
|
{
|
||||||
auto header_buffer = static_cast<std::vector<std::string> *>(priv_data);
|
auto header_buffer = static_cast<std::vector<std::string> *>(priv_data);
|
||||||
|
header_buffer->push_back(trim_string(std::string(data, size * nmemb)));
|
||||||
size_t real_size = size * nmemb;
|
return size * nmemb;
|
||||||
|
|
||||||
if (real_size < LOCATION_HEADER_LENGTH)
|
|
||||||
return real_size;
|
|
||||||
|
|
||||||
if (!astrcmpi_n(data, "location: ", LOCATION_HEADER_LENGTH)) {
|
|
||||||
char *val = data + LOCATION_HEADER_LENGTH;
|
|
||||||
auto header_temp =
|
|
||||||
std::string(val, real_size - LOCATION_HEADER_LENGTH);
|
|
||||||
|
|
||||||
header_temp = trim_string(header_temp);
|
|
||||||
header_buffer->push_back(header_temp);
|
|
||||||
}
|
|
||||||
|
|
||||||
return real_size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline std::string generate_user_agent()
|
static inline std::string generate_user_agent()
|
||||||
|
|
Loading…
Reference in a new issue