From dceb24ad7c319ca5200dab92083f91b30af88a65 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 12 Jan 2021 02:17:39 +0100 Subject: [PATCH] Add support for WXWEBREQUEST_BACKEND environment variable Defining this variable overrides the default backend choice. Document the variable itself and also extend wxWebSession::New() documentation. --- docs/doxygen/overviews/envvars.h | 6 ++++++ interface/wx/webrequest.h | 17 +++++++++++++++-- src/common/webrequest.cpp | 15 +++++++++------ 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/docs/doxygen/overviews/envvars.h b/docs/doxygen/overviews/envvars.h index b3604df420..7a3426e5fc 100644 --- a/docs/doxygen/overviews/envvars.h +++ b/docs/doxygen/overviews/envvars.h @@ -26,5 +26,11 @@ wxWidgets programs. @c /usr/local or @c /usr). You can set WXPREFIX if you are for example distributing a binary version of an application and you don't know in advance where it will be installed.} +@itemdef{WXWEBREQUEST_BACKEND, + This variable can be set to override the choice of the default backend + used by wxWebRequest, see wxWebSession::New(). Most common use is to + set it to @c "CURL" to force using libcurl-based implementation under + MSW or macOS platforms where the native implementation would be chosed + by default.} */ diff --git a/interface/wx/webrequest.h b/interface/wx/webrequest.h index 25e1a3f0fa..7973e1f197 100644 --- a/interface/wx/webrequest.h +++ b/interface/wx/webrequest.h @@ -610,15 +610,28 @@ public: /** Creates a new wxWebSession object. + @a backend may be specified explicitly by using of the predefined @c + wxWebSessionBackendWinHTTP, @c wxWebSessionBackendURLSession or @c + wxWebSessionBackendCURL constants to select the corresponding backend + or left empty to select the default backend. The default depends on the + the current platform: WinHTTP-based implementation is used under MSW, + NSURLSession-based one under macOS and libcurl-based otherwise. + + Further, if @c WXWEBREQUEST_BACKEND environment variable is defined, it + overrides the default backend selection, allowing to force the use of + libcurl-based implementation by default under MSW or macOS platforms, + for example. + Use IsOpened() to check if the session creation succeeded. @param backend - The backend web session implementation to use. + The backend web session implementation to use or empty to use the + default implementation as described above. @return The created wxWebSession */ - static wxWebSession New(const wxString& backend = wxWebSessionBackendDefault); + static wxWebSession New(const wxString& backend = wxString()); /** Allows to check if the specified backend is available at runtime. diff --git a/src/common/webrequest.cpp b/src/common/webrequest.cpp index d5380b48be..5de8f13949 100644 --- a/src/common/webrequest.cpp +++ b/src/common/webrequest.cpp @@ -39,9 +39,9 @@ #include "wx/private/webrequest_curl.h" #endif -extern WXDLLIMPEXP_DATA_NET(const char) wxWebSessionBackendWinHTTP[] = "wxWebSessionBackendWinHTTP"; -extern WXDLLIMPEXP_DATA_NET(const char) wxWebSessionBackendURLSession[] = "wxWebSessionBackendURLSession"; -extern WXDLLIMPEXP_DATA_NET(const char) wxWebSessionBackendCURL[] = "wxWebSessionBackendCURL"; +extern WXDLLIMPEXP_DATA_NET(const char) wxWebSessionBackendWinHTTP[] = "WinHTTP"; +extern WXDLLIMPEXP_DATA_NET(const char) wxWebSessionBackendURLSession[] = "URLSession"; +extern WXDLLIMPEXP_DATA_NET(const char) wxWebSessionBackendCURL[] = "CURL"; wxDEFINE_EVENT(wxEVT_WEBREQUEST_STATE, wxWebRequestEvent); wxDEFINE_EVENT(wxEVT_WEBREQUEST_DATA, wxWebRequestEvent); @@ -824,13 +824,16 @@ wxWebSession wxWebSession::New(const wxString& backendOrig) wxString backend = backendOrig; if ( backend.empty() ) { + if ( !wxGetEnv("WXWEBREQUEST_BACKEND", &backend) ) + { #if wxUSE_WEBREQUEST_WINHTTP - backend = wxWebSessionBackendWinHTTP; + backend = wxWebSessionBackendWinHTTP; #elif wxUSE_WEBREQUEST_URLSESSION - backend = wxWebSessionBackendURLSession; + backend = wxWebSessionBackendURLSession; #elif wxUSE_WEBREQUEST_CURL - backend = wxWebSessionBackendCURL; + backend = wxWebSessionBackendCURL; #endif + } } wxStringWebSessionFactoryMap::iterator factory = gs_factoryMap.find(backend);