From 5d236edeed4dcd409f6e131fe385ebe9a93b575c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 9 Jan 2021 21:00:38 +0100 Subject: [PATCH] Ensure wxWebRequest is in idle state before starting it Check that current state is State_Idle in wxWebRequest itself only once instead of doing it in 2 (out of 3) wxWebRequestImpl implementations. Also assert if this is not the case instead of silently doing nothing which would surely be more difficult to debug. --- include/wx/private/webrequest.h | 1 + interface/wx/webrequest.h | 3 +++ src/common/webrequest.cpp | 3 +++ src/common/webrequest_curl.cpp | 3 --- src/msw/webrequest_winhttp.cpp | 3 --- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/include/wx/private/webrequest.h b/include/wx/private/webrequest.h index b74bbd566b..fca59cf843 100644 --- a/include/wx/private/webrequest.h +++ b/include/wx/private/webrequest.h @@ -64,6 +64,7 @@ public: wxWebRequest::Storage GetStorage() const { return m_storage; } + // Precondition for this method checked by caller: current state is idle. virtual void Start() = 0; virtual void Cancel() = 0; diff --git a/interface/wx/webrequest.h b/interface/wx/webrequest.h index dcde845b5a..90f3b16db1 100644 --- a/interface/wx/webrequest.h +++ b/interface/wx/webrequest.h @@ -187,6 +187,9 @@ public: Events will be triggered on success or failure. + The current state must be @c State_Idle, already started requests can't + be started again. + @see Cancel() */ void Start(); diff --git a/src/common/webrequest.cpp b/src/common/webrequest.cpp index 58fecf82ec..f5b9c40e3b 100644 --- a/src/common/webrequest.cpp +++ b/src/common/webrequest.cpp @@ -391,6 +391,9 @@ void wxWebRequest::Start() { wxCHECK_IMPL_VOID(); + wxCHECK_RET( m_impl->GetState() == wxWebRequest::State_Idle, + "Completed requests can not be restarted" ); + m_impl->Start(); } diff --git a/src/common/webrequest_curl.cpp b/src/common/webrequest_curl.cpp index 98b43c51aa..f9014ef7bd 100644 --- a/src/common/webrequest_curl.cpp +++ b/src/common/webrequest_curl.cpp @@ -187,9 +187,6 @@ wxWebRequestCURL::~wxWebRequestCURL() void wxWebRequestCURL::Start() { - if ( GetState() != wxWebRequest::State_Idle ) - return; - m_response.reset(new wxWebResponseCURL(*this)); if ( m_dataSize ) diff --git a/src/msw/webrequest_winhttp.cpp b/src/msw/webrequest_winhttp.cpp index e941ff9bde..c48f88ac06 100644 --- a/src/msw/webrequest_winhttp.cpp +++ b/src/msw/webrequest_winhttp.cpp @@ -237,9 +237,6 @@ void wxWebRequestWinHTTP::SetFailed(DWORD errorCode) void wxWebRequestWinHTTP::Start() { - if ( GetState() != wxWebRequest::State_Idle ) // Completed requests can not be restarted - return; - // Parse the URL wxURI uri(m_url); bool isSecure = uri.GetScheme().IsSameAs("HTTPS", false);