From 85c6fee7cf8917468029b28ae05ee71ae05b051c Mon Sep 17 00:00:00 2001 From: Tobias Taschner Date: Mon, 12 Nov 2018 21:42:36 +0100 Subject: [PATCH] Add support for libcurl before version 7.28.0 Support older versions might be useful for older linux distributions and could be used as a possible fallback to macOS URLSession implementation on macOS 10.7 and 10.8. --- src/common/webrequest_curl.cpp | 48 +++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/common/webrequest_curl.cpp b/src/common/webrequest_curl.cpp index de4e96db31..746e7455a5 100644 --- a/src/common/webrequest_curl.cpp +++ b/src/common/webrequest_curl.cpp @@ -32,6 +32,12 @@ (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z)) #endif +#if CURL_AT_LEAST_VERSION(7, 28, 0) + #define wxCURL_HAVE_MULTI_WAIT 1 +#else + #define wxCURL_HAVE_MULTI_WAIT 0 +#endif + // // wxWebResponseCURL // @@ -384,6 +390,46 @@ wxWebRequest* wxWebSessionCURL::CreateRequest(const wxString& url, int id) return new wxWebRequestCURL(*this, id, url); } +static CURLMcode wx_curl_multi_wait(CURLM *multi_handle, int timeout_ms, + int *ret) +{ + // since libcurl 7.28.0 the curl_multi_wait method is more convient than + // calling multiple curl_multi_... methods. + // When support for older libcurl versions is dropped this wrapper can be + // removed. +#if wxCURL_HAVE_MULTI_WAIT + return curl_multi_wait(multi_handle, NULL, 0, timeout_ms, ret); +#else + wxASSERT(ret != NULL); + + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; + timeval timeout; + + long curl_timeo; + + curl_multi_timeout(multi_handle, &curl_timeo); + if ( curl_timeo < 0 ) + curl_timeo = timeout_ms; + + timeout.tv_sec = curl_timeo / 1000; + timeout.tv_usec = (curl_timeo % 1000) * 1000; + + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); + FD_ZERO(&fdexcep); + + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, ret); + if ( *ret == -1 ) + return CURLM_OK; + else if ( select(*ret + 1, &fdread, &fdwrite, &fdexcep, &timeout) == -1 ) + return CURLM_BAD_SOCKET; + else + return CURLM_OK; +#endif +} + wxThread::ExitCode wxWebSessionCURL::Entry() { m_mutex.Lock(); @@ -425,7 +471,7 @@ wxThread::ExitCode wxWebSessionCURL::Entry() { // Wait for CURL work to finish int numfds; - curl_multi_wait(m_handle, NULL, 0, 500, &numfds); + wx_curl_multi_wait(m_handle, 500, &numfds); if ( !numfds ) {