Merge pull request #2 from franksinankaya/frkaya/timeouts

Add connection timeout option
This commit is contained in:
Sinan Kaya 2020-07-27 20:24:06 -04:00 коммит произвёл GitHub
Родитель 28c503b6fb 04844a7053
Коммит bedec757a5
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
2 изменённых файлов: 20 добавлений и 33 удалений

Просмотреть файл

@ -644,17 +644,6 @@ BOOL ComContainer::RemoveHandle(std::shared_ptr<WinHttpRequestImp> &srequest, CU
return TRUE;
}
long ComContainer::GetTimeout()
{
long curl_timeo;
m_MultiMutex.lock();
curl_multi_timeout(m_curlm, &curl_timeo);
m_MultiMutex.unlock();
return curl_timeo;
}
void ComContainer::KickStart()
{
std::lock_guard<std::mutex> lck(m_hAsyncEventMtx);
@ -744,20 +733,6 @@ void WinHttpHandleContainer<T>::Register(std::shared_ptr<T> rqst)
m_ActiveRequests.push_back(rqst);
}
long WinHttpSessionImp::GetTimeout() const {
if (m_Timeout)
return m_Timeout;
long curl_timeo;
curl_timeo = ComContainer::GetInstance().GetTimeout();
if (curl_timeo < 0)
curl_timeo = 10000;
return curl_timeo;
}
WinHttpSessionImp::~WinHttpSessionImp()
{
TRACE("%-35s:%-8d:%-16p sesion\n", __func__, __LINE__, (void*)this);
@ -1746,9 +1721,15 @@ WINHTTPAPI HINTERNET WINAPI WinHttpOpenRequest(
}
}
if (session->GetTimeout() > 0)
if (session->GetConnectionTimeoutMs() > 0)
{
res = curl_easy_setopt(request->GetCurl(), CURLOPT_TIMEOUT_MS, session->GetTimeout());
res = curl_easy_setopt(request->GetCurl(), CURLOPT_CONNECTTIMEOUT, session->GetConnectionTimeoutMs()/1000);
CURL_BAILOUT_ONERROR(res, request, NULL);
}
if (session->GetReceiveTimeoutMs() > 0)
{
res = curl_easy_setopt(request->GetCurl(), CURLOPT_TIMEOUT_MS, session->GetReceiveTimeoutMs());
CURL_BAILOUT_ONERROR(res, request, NULL);
}
@ -2384,12 +2365,15 @@ WinHttpSetTimeouts
__func__, __LINE__, (void*)base, nResolveTimeout, nConnectTimeout, nSendTimeout, nReceiveTimeout);
if ((session = dynamic_cast<WinHttpSessionImp *>(base)))
{
session->SetTimeout(nReceiveTimeout);
session->SetReceiveTimeoutMs(nReceiveTimeout);
session->SetConnectionTimeoutMs(nConnectTimeout);
}
else if ((request = dynamic_cast<WinHttpRequestImp *>(base)))
{
res = curl_easy_setopt(request->GetCurl(), CURLOPT_TIMEOUT_MS, nReceiveTimeout);
CURL_BAILOUT_ONERROR(res, request, FALSE);
res = curl_easy_setopt(request->GetCurl(), CURLOPT_CONNECTTIMEOUT, nConnectTimeout/1000);
CURL_BAILOUT_ONERROR(res, request, FALSE);
}
else
return FALSE;
@ -2847,7 +2831,7 @@ WinHttpQueryOption
if (!session)
return FALSE;
*static_cast<DWORD *>(lpBuffer) = session->GetTimeout();
*static_cast<DWORD *>(lpBuffer) = session->GetConnectionTimeoutMs();
}
if (WINHTTP_OPTION_CALLBACK == dwOption)
{

Просмотреть файл

@ -68,7 +68,8 @@ class WinHttpSessionImp :public WinHttpBase
DWORD m_NotificationFlags = 0;
int m_ServerPort = 0;
long m_Timeout = 15000;
long m_ReceiveTimeoutMs = 15000;
long m_ConnectionTimeoutMs = 15000;
BOOL m_Async = false;
bool m_closing = false;
@ -121,8 +122,11 @@ public:
int GetServerPort() const { return m_ServerPort; }
void SetServerPort(int port) { m_ServerPort = port; }
long GetTimeout() const;
void SetTimeout(long timeout) { m_Timeout = timeout; }
long GetReceiveTimeoutMs() const { return m_ReceiveTimeoutMs; };
void SetReceiveTimeoutMs(long timeout) { m_ReceiveTimeoutMs = timeout; }
long GetConnectionTimeoutMs() const { return m_ConnectionTimeoutMs; }
void SetConnectionTimeoutMs(long timeout) { m_ConnectionTimeoutMs = timeout; }
std::string &GetServerName() { return m_ServerName; }
@ -599,7 +603,6 @@ public:
void ResumeTransfer(CURL *handle, int bitmask);
BOOL AddHandle(std::shared_ptr<WinHttpRequestImp> &srequest, CURL *handle);
BOOL RemoveHandle(std::shared_ptr<WinHttpRequestImp> &srequest, CURL *handle, bool clearPrivate);
long GetTimeout();
void KickStart();
ComContainer();
~ComContainer();