mirror of https://github.com/axmolengine/axmol.git
issue #2389: Adding cookie support for HttpClient
This commit is contained in:
parent
c545f6d56c
commit
3f57275848
|
@ -30,6 +30,8 @@
|
||||||
|
|
||||||
#include "curl/curl.h"
|
#include "curl/curl.h"
|
||||||
|
|
||||||
|
#include "platform/CCFileUtils.h"
|
||||||
|
|
||||||
NS_CC_EXT_BEGIN
|
NS_CC_EXT_BEGIN
|
||||||
|
|
||||||
static std::mutex s_requestQueueMutex;
|
static std::mutex s_requestQueueMutex;
|
||||||
|
@ -44,7 +46,7 @@ static unsigned long s_asyncRequestCount = 0;
|
||||||
typedef int int32_t;
|
typedef int int32_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool need_quit = false;
|
static bool s_need_quit = false;
|
||||||
|
|
||||||
static Array* s_requestQueue = NULL;
|
static Array* s_requestQueue = NULL;
|
||||||
static Array* s_responseQueue = NULL;
|
static Array* s_responseQueue = NULL;
|
||||||
|
@ -55,6 +57,8 @@ static char s_errorBuffer[CURL_ERROR_SIZE];
|
||||||
|
|
||||||
typedef size_t (*write_callback)(void *ptr, size_t size, size_t nmemb, void *stream);
|
typedef size_t (*write_callback)(void *ptr, size_t size, size_t nmemb, void *stream);
|
||||||
|
|
||||||
|
static std::string s_cookieFilename = "";
|
||||||
|
|
||||||
// Callback function used by libcurl for collect response data
|
// Callback function used by libcurl for collect response data
|
||||||
static size_t writeData(void *ptr, size_t size, size_t nmemb, void *stream)
|
static size_t writeData(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||||
{
|
{
|
||||||
|
@ -96,7 +100,7 @@ static void networkThread(void)
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (need_quit)
|
if (s_need_quit)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -298,6 +302,14 @@ public:
|
||||||
if (!setOption(CURLOPT_HTTPHEADER, _headers))
|
if (!setOption(CURLOPT_HTTPHEADER, _headers))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!s_cookieFilename.empty()) {
|
||||||
|
if (!setOption(CURLOPT_COOKIEFILE, s_cookieFilename.c_str())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!setOption(CURLOPT_COOKIEJAR, s_cookieFilename.c_str())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return setOption(CURLOPT_URL, request->getUrl())
|
return setOption(CURLOPT_URL, request->getUrl())
|
||||||
&& setOption(CURLOPT_WRITEFUNCTION, callback)
|
&& setOption(CURLOPT_WRITEFUNCTION, callback)
|
||||||
|
@ -313,9 +325,10 @@ public:
|
||||||
if (CURLE_OK != curl_easy_perform(_curl))
|
if (CURLE_OK != curl_easy_perform(_curl))
|
||||||
return false;
|
return false;
|
||||||
CURLcode code = curl_easy_getinfo(_curl, CURLINFO_RESPONSE_CODE, responseCode);
|
CURLcode code = curl_easy_getinfo(_curl, CURLINFO_RESPONSE_CODE, responseCode);
|
||||||
if (code != CURLE_OK || *responseCode != 200)
|
if (code != CURLE_OK || *responseCode != 200) {
|
||||||
|
CCLOGERROR("Curl curl_easy_getinfo failed: %s", curl_easy_strerror(code));
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
// Get some mor data.
|
// Get some mor data.
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -384,6 +397,15 @@ void HttpClient::destroyInstance()
|
||||||
s_pHttpClient->release();
|
s_pHttpClient->release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HttpClient::enableCookies(const char* cookieFile) {
|
||||||
|
if (cookieFile) {
|
||||||
|
s_cookieFilename = std::string(cookieFile);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
s_cookieFilename = (FileUtils::sharedFileUtils()->getWritablePath() + "cookieFile.txt");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HttpClient::HttpClient()
|
HttpClient::HttpClient()
|
||||||
: _timeoutForConnect(30)
|
: _timeoutForConnect(30)
|
||||||
, _timeoutForRead(60)
|
, _timeoutForRead(60)
|
||||||
|
@ -395,7 +417,7 @@ HttpClient::HttpClient()
|
||||||
|
|
||||||
HttpClient::~HttpClient()
|
HttpClient::~HttpClient()
|
||||||
{
|
{
|
||||||
need_quit = true;
|
s_need_quit = true;
|
||||||
|
|
||||||
if (s_requestQueue != NULL) {
|
if (s_requestQueue != NULL) {
|
||||||
s_SleepCondition.notify_one();
|
s_SleepCondition.notify_one();
|
||||||
|
@ -421,7 +443,7 @@ bool HttpClient::lazyInitThreadSemphore()
|
||||||
auto t = std::thread(&networkThread);
|
auto t = std::thread(&networkThread);
|
||||||
t.detach();
|
t.detach();
|
||||||
|
|
||||||
need_quit = false;
|
s_need_quit = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -52,6 +52,9 @@ public:
|
||||||
/** Relase the shared instance **/
|
/** Relase the shared instance **/
|
||||||
static void destroyInstance();
|
static void destroyInstance();
|
||||||
|
|
||||||
|
/** Enable cookie support. **/
|
||||||
|
static void enableCookies(const char* cookieFile);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a get request to task queue
|
* Add a get request to task queue
|
||||||
* @param request a HttpRequest object, which includes url, response callback etc.
|
* @param request a HttpRequest object, which includes url, response callback etc.
|
||||||
|
|
Loading…
Reference in New Issue