diff options
Diffstat (limited to 'protocols/VKontakte/src/vk_queue.cpp')
-rw-r--r-- | protocols/VKontakte/src/vk_queue.cpp | 165 |
1 files changed, 80 insertions, 85 deletions
diff --git a/protocols/VKontakte/src/vk_queue.cpp b/protocols/VKontakte/src/vk_queue.cpp index fde2bc0294..6ae7873b62 100644 --- a/protocols/VKontakte/src/vk_queue.cpp +++ b/protocols/VKontakte/src/vk_queue.cpp @@ -1,5 +1,5 @@ /*
-Copyright (c) 2013-24 Miranda NG team (https://miranda-ng.org)
+Copyright (c) 2013-25 Miranda NG team (https://miranda-ng.org)
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@@ -34,64 +34,88 @@ void CVkProto::UninitQueue() bool CVkProto::ExecuteRequest(AsyncHttpRequest *pReq)
{
- do {
- pReq->bNeedsRestart = false;
- pReq->m_iErrorCode = 0;
- pReq->m_szUrl = pReq->m_szUrl.GetBuffer();
-
- if (pReq->m_bApiReq) {
- pReq->flags |= NLHRF_PERSISTENT;
- pReq->nlc = m_hAPIConnection;
- }
+ pReq->bNeedsRestart = false;
+ pReq->m_iErrorCode = 0;
- if (m_bTerminated)
- break;
+ if (pReq->m_bApiReq) {
+ pReq->flags |= NLHRF_PERSISTENT;
+ pReq->nlc = m_hAPIConnection;
+ }
- time_t tLocalWorkThreadTimer = 0;
- {
- mir_cslock lck(m_csWorkThreadTimer);
- tLocalWorkThreadTimer = m_tWorkThreadTimer = time(0);
- }
+ if (m_bTerminated) {
+ delete pReq;
+ return false;
+ }
- debugLogA("CVkProto::ExecuteRequest \n====\n%s\n====\n", pReq->m_szUrl.c_str());
- NLHR_PTR reply(Netlib_HttpTransaction(m_hNetlibUser, pReq));
- {
- mir_cslock lck(m_csWorkThreadTimer);
- if (tLocalWorkThreadTimer != m_tWorkThreadTimer) {
- debugLogA("CVkProto::WorkerThread is living Dead => return");
- delete pReq;
- return false;
- }
- }
+ time_t tLocalWorkThreadTimer = 0;
+ {
+ mir_cslock lck(m_csWorkThreadTimer);
+ tLocalWorkThreadTimer = m_tWorkThreadTimer = time(0);
+ if (pReq->m_bApiReq)
+ ApplyCookies(pReq);
+ }
- if (reply != nullptr) {
- if (pReq->m_pFunc != nullptr)
- (this->*(pReq->m_pFunc))(reply, pReq); // may be set pReq->bNeedsRestart
+ CMStringA szParam(pReq->m_szParam);
+ if (!IsEmpty(m_szAccessToken))
+ szParam.Replace(m_szAccessToken, "*secret*");
+ debugLogA("CVkProto::ExecuteRequest \n====\n%s\n%s\n====\n", pReq->m_szUrl.c_str(), szParam.c_str());
- if (pReq->m_bApiReq)
- m_hAPIConnection = reply->nlc;
+ NLHR_PTR reply(Netlib_HttpTransaction(m_hNetlibUser, pReq));
+ {
+ mir_cslock lck(m_csWorkThreadTimer);
+ if (pReq->m_bApiReq)
+ GrabCookies(reply, "api.vk.com");
+
+ if (tLocalWorkThreadTimer != m_tWorkThreadTimer) {
+ debugLogA("CVkProto::WorkerThread is living Dead => return");
+ delete pReq;
+ return false;
}
- else if (pReq->bIsMainConn) {
- if (IsStatusConnecting(m_iStatus))
- ConnectionFailed(LOGINERR_NONETWORK);
- else if (pReq->m_iRetry && !m_bTerminated) {
- pReq->bNeedsRestart = true;
- Sleep(1000); //Pause for fix err
- pReq->m_iRetry--;
- debugLogA("CVkProto::ExecuteRequest restarting (retry = %d)", MAX_RETRIES - pReq->m_iRetry);
- }
- else {
- debugLogA("CVkProto::ExecuteRequest ShutdownSession");
- ShutdownSession();
- }
+ }
+
+ if (reply != nullptr) {
+ if (pReq->m_pFunc != nullptr)
+ (this->*(pReq->m_pFunc))(reply, pReq); // may be set pReq->bNeedsRestart
+
+ if (pReq->m_bApiReq)
+ m_hAPIConnection = reply->nlc;
+ }
+ else if (pReq->bIsMainConn) {
+ if (IsStatusConnecting(m_iStatus))
+ ConnectionFailed(LOGINERR_NONETWORK);
+ else if (pReq->m_iRetry && !m_bTerminated)
+ pReq->bNeedsRestart = true;
+ else {
+ debugLogA("CVkProto::ExecuteRequest ShutdownSession");
+ ShutdownSession();
+ return false;
}
- debugLogA("CVkProto::ExecuteRequest pReq->bNeedsRestart = %d", (int)pReq->bNeedsRestart);
+ }
+
+ if (pReq->bNeedsRestart)
+ RestartRequest(pReq);
+ else
+ delete pReq;
+
+ return true;
+}
+
+bool CVkProto::RestartRequest(AsyncHttpRequest* pReq)
+{
+ debugLogA("CVkProto::RestartRequest %d %s", (MAX_RETRIES - pReq->m_iRetry + 1), pReq->m_szUrl.c_str());
+
+ if (m_bTerminated || !pReq->m_iRetry) {
+ ShutdownSession();
+ delete pReq;
+ pReq = nullptr;
+ return false;
+ }
- if (!reply && pReq->m_bApiReq)
- CloseAPIConnection();
+ pReq->bNeedsRestart = false;
+ pReq->m_priority = AsyncHttpRequest::RequestPriority::rpRestart;
+ pReq->m_iRetry--;
- } while (pReq->bNeedsRestart && !m_bTerminated);
- delete pReq;
+ Push(pReq);
return true;
}
@@ -103,7 +127,8 @@ AsyncHttpRequest* CVkProto::Push(MHttpRequest *p, int iTimeout) debugLogA("CVkProto::Push");
pReq->timeout = iTimeout;
- if (pReq->m_bApiReq) {
+
+ if (pReq->m_bApiReq && (pReq->m_iRetry == MAX_RETRIES)) {
pReq << VER_API;
if (!IsEmpty(m_vkOptions.pwszVKLang))
pReq << WCHAR_PARAM("lang", m_vkOptions.pwszVKLang);
@@ -137,40 +162,8 @@ void CVkProto::WorkerThread(void*) if (m_szAccessToken != nullptr)
// try to receive a response from server
RetrieveMyInfo();
- else {
- // Initialize new OAuth session
- extern char szBlankUrl[];
- extern char szVKUserAgent[];
- extern char szVKUserAgentCH[];
-
- AsyncHttpRequest *pReq = new AsyncHttpRequest(this, REQUEST_GET, "https://oauth.vk.com/authorize", false, &CVkProto::OnOAuthAuthorize);
- pReq
- << INT_PARAM("client_id", VK_APP_ID)
- << CHAR_PARAM("scope", szScore)
- << CHAR_PARAM("redirect_uri", szBlankUrl)
- << CHAR_PARAM("display", "mobile")
- << CHAR_PARAM("response_type", "token")
- << VER_API;
-
- // Headers
- pReq->AddHeader("User-agent", szVKUserAgent);
- pReq->AddHeader("dht", "1");
- pReq->AddHeader("origin", "https://oauth.vk.com");
- pReq->AddHeader("referer", "https://oauth.vk.com/");
- pReq->AddHeader("sec-ch-ua", szVKUserAgentCH);
- pReq->AddHeader("sec-ch-ua-mobile", "?0");
- pReq->AddHeader("sec-ch-ua-platform", "Windows");
- pReq->AddHeader("sec-fetch-dest", "document");
- pReq->AddHeader("sec-fetch-mode", "navigate");
- pReq->AddHeader("sec-fetch-site", "same-site");
- pReq->AddHeader("sec-fetch-user", "?1");
- pReq->AddHeader("upgrade-insecure-requests", "1");
- //Headers
-
- pReq->m_bApiReq = false;
- pReq->bIsMainConn = true;
- Push(pReq);
- }
+ else
+ LogIn();
CloseAPIConnection();
@@ -197,6 +190,8 @@ void CVkProto::WorkerThread(void*) if (!(pReq->m_bApiReq))
lWaitingTime = 0;
+ else if (pReq->m_priority == AsyncHttpRequest::rpLowCListEvents) // for 'error 9' fix
+ lWaitingTime += m_vkOptions.iTimeoutForUsersGet > 60000 ? 5000 : m_vkOptions.iTimeoutForUsersGet;
}
if (m_bTerminated)
|