首页 > 代码库 > 【转】让 cocos2d-x 的 CCHttpRequest 支持https

【转】让 cocos2d-x 的 CCHttpRequest 支持https

肖锐(Cooki)个人原创,欢迎转载,转载请注明地址,肖锐(Cooki)的技术博客 http://blog.csdn.net/xiao0026


 由于游戏用到了网络头像, 今天发现换成facebook登陆后头像下载失败, 2dx默认的没有支持https, 于是找到 network/

HttpClient.cpp


[cpp] view plaincopy
  1.   
[cpp] view plaincopy
  1. int processGetTask(CCHttpRequest *request, write_callback callback, void *stream, int *responseCode)  
  2. {  
  3.     CURLcode code = CURL_LAST;  
  4.     CURL *curl = curl_easy_init();  
  5.       
  6.     do {  
  7.         if (!configureCURL(curl))   
  8.         {  
  9.             break;  
  10.         }  
  11.           
  12.         /* handle custom header data */  
  13.         /* create curl linked list */  
  14.         struct curl_slist *cHeaders=NULL;  
  15.         /* get custom header data (if set) */  
  16.         std::vector<std::string> headers=request->getHeaders();  
  17.             if(!headers.empty())  
  18.             {                 
  19.                     for(std::vector<std::string>::iterator it=headers.begin();it!=headers.end();it++)  
  20.                     {  
  21.               /* append custom headers one by one */  
  22.                         cHeaders=curl_slist_append(cHeaders,it->c_str());  
  23.                     }  
  24.            /* set custom headers for curl */  
  25.                     code = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, cHeaders);  
  26.                     if (code != CURLE_OK) {  
  27.                         break;  
  28.                     }  
  29.             }  
  30.                 
  31.         code = curl_easy_setopt(curl, CURLOPT_URL, request->getUrl());  
  32.         if (code != CURLE_OK)   
  33.         {  
  34.             break;  
  35.         }  
  36.           
  37.         code = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, request->getUrl());  
  38.         if (code != CURLE_OK)  
  39.         {  
  40.             break;  
  41.         }  
  42.   
  43.         code = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);  
  44.         if (code != CURLE_OK)   
  45.         {  
  46.             break;  
  47.         }  
  48.           
  49.         code = curl_easy_setopt(curl, CURLOPT_WRITEDATA, stream);  
  50.         if (code != CURLE_OK)   
  51.         {  
  52.             break;  
  53.         }  
  54.           
  55.         code = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);  
  56.         if (code != CURLE_OK) {  
  57.             break;  
  58.         }  
  59.           
  60.         code = curl_easy_perform(curl);  
  61.         if (code != CURLE_OK)   
  62.         {  
  63.             break;  
  64.         }  
  65.           
  66.         /* free the linked list for header data */  
  67.         curl_slist_free_all(cHeaders);  
  68.   
  69.         code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, responseCode);   
  70.         if (code != CURLE_OK || *responseCode != 200)   
  71.         {  
  72.             code = CURLE_HTTP_RETURNED_ERROR;  
  73.         }  
  74.     } while (0);  
  75.       
  76.     if (curl) {  
  77.         curl_easy_cleanup(curl);  
  78.     }  
  79.       
  80.     return (code == CURLE_OK ? 0 : 1);  
  81. }  
  82.   
  83. //Process POST Request  
  84. int processPostTask(CCHttpRequest *request, write_callback callback, void *stream, int32_t *responseCode)  
  85. {  
  86.     CURLcode code = CURL_LAST;  
  87.     CURL *curl = curl_easy_init();  
  88.       
  89.     do {  
  90.         if (!configureCURL(curl)) {  
  91.             break;  
  92.         }  
  93.           
  94.         /* handle custom header data */  
  95.         /* create curl linked list */  
  96.         struct curl_slist *cHeaders=NULL;  
  97.         /* get custom header data (if set) */  
  98.             std::vector<std::string> headers=request->getHeaders();  
  99.             if(!headers.empty())  
  100.             {                 
  101.                     for(std::vector<std::string>::iterator it=headers.begin();it!=headers.end();it++)  
  102.                     {  
  103.               /* append custom headers one by one */  
  104.                         cHeaders=curl_slist_append(cHeaders,it->c_str());  
  105.                     }  
  106.            /* set custom headers for curl */  
  107.                     code = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, cHeaders);  
  108.                     if (code != CURLE_OK) {  
  109.                         break;  
  110.                     }  
  111.             }  
  112.                 
  113.         code = curl_easy_setopt(curl, CURLOPT_URL, request->getUrl());  
  114.         if (code != CURLE_OK) {  
  115.             break;  
  116.         }  
  117.         code = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);  
  118.         if (code != CURLE_OK) {  
  119.             break;  
  120.         }  
  121.         code = curl_easy_setopt(curl, CURLOPT_WRITEDATA, stream);  
  122.         if (code != CURLE_OK) {  
  123.             break;  
  124.         }  
  125.         code = curl_easy_setopt(curl, CURLOPT_POST, 1);  
  126.         if (code != CURLE_OK) {  
  127.             break;  
  128.         }  
  129.         code = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);  
  130.         if (code != CURLE_OK) {  
  131.             break;  
  132.         }  
  133.         code = curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request->getRequestData());  
  134.         if (code != CURLE_OK) {  
  135.             break;  
  136.         }  
  137.         code = curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, request->getRequestDataSize());  
  138.         if (code != CURLE_OK) {  
  139.             break;  
  140.         }  
  141.         code = curl_easy_perform(curl);  
  142.         if (code != CURLE_OK) {  
  143.             break;  
  144.         }  
  145.           
  146.         /* free the linked list for header data */  
  147.         curl_slist_free_all(cHeaders);  
  148.   
  149.         code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, responseCode);  
  150.         if (code != CURLE_OK || *responseCode != 200) {  
  151.             code = CURLE_HTTP_RETURNED_ERROR;  
  152.         }  
  153.     } while (0);  
  154.     if (curl) {  
  155.         curl_easy_cleanup(curl);  
  156.     }  
  157.       
  158.     return (code == CURLE_OK ? 0 : 1);      
  159. }  


 

[cpp] view plaincopy
  1. code = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);  
  2.         if (code != CURLE_OK) {  
  3.             break;  
  4.         }  
[cpp] view plaincopy
    1. 加入这一段curl代码, 即可支持解析https解析,不管是get还是post都可 

【转】让 cocos2d-x 的 CCHttpRequest 支持https