llcurl.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:7k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llcurl.h
  3.  * @author Zero / Donovan
  4.  * @date 2006-10-15
  5.  * @brief A wrapper around libcurl.
  6.  *
  7.  * $LicenseInfo:firstyear=2006&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2006-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34.  
  35. #ifndef LL_LLCURL_H
  36. #define LL_LLCURL_H
  37. #include "linden_common.h"
  38. #include <sstream>
  39. #include <string>
  40. #include <vector>
  41. #include <boost/intrusive_ptr.hpp>
  42. #include <curl/curl.h> // TODO: remove dependency
  43. #include "llbuffer.h"
  44. #include "lliopipe.h"
  45. #include "llsd.h"
  46. class LLMutex;
  47. // For whatever reason, this is not typedef'd in curl.h
  48. typedef size_t (*curl_header_callback)(void *ptr, size_t size, size_t nmemb, void *stream);
  49. class LLCurl
  50. {
  51. LOG_CLASS(LLCurl);
  52. public:
  53. class Easy;
  54. class Multi;
  55. struct TransferInfo
  56. {
  57. TransferInfo() : mSizeDownload(0.0), mTotalTime(0.0), mSpeedDownload(0.0) {}
  58. F64 mSizeDownload;
  59. F64 mTotalTime;
  60. F64 mSpeedDownload;
  61. };
  62. class Responder
  63. {
  64. //LOG_CLASS(Responder);
  65. public:
  66. Responder();
  67. virtual ~Responder();
  68. /**
  69.  * @brief return true if the status code indicates success.
  70.  */
  71. static bool isGoodStatus(U32 status)
  72. {
  73. return((200 <= status) && (status < 300));
  74. }
  75. virtual void errorWithContent(
  76. U32 status,
  77. const std::string& reason,
  78. const LLSD& content);
  79. //< called by completed() on bad status 
  80. virtual void error(U32 status, const std::string& reason);
  81. //< called by default error(status, reason, content)
  82. virtual void result(const LLSD& content);
  83. //< called by completed for good status codes.
  84. virtual void completedRaw(
  85. U32 status,
  86. const std::string& reason,
  87. const LLChannelDescriptors& channels,
  88. const LLIOPipe::buffer_ptr_t& buffer);
  89. /**< Override point for clients that may want to use this
  90.    class when the response is some other format besides LLSD
  91. */
  92. virtual void completed(
  93. U32 status,
  94. const std::string& reason,
  95. const LLSD& content);
  96. /**< The default implemetnation calls
  97. either:
  98. * result(), or
  99. * error() 
  100. */
  101. // Override to handle parsing of the header only.  Note: this is the only place where the contents
  102. // of the header can be parsed.  In the ::completed call above only the body is contained in the LLSD.
  103. virtual void completedHeader(U32 status, const std::string& reason, const LLSD& content);
  104. // Used internally to set the url for debugging later.
  105. void setURL(const std::string& url);
  106. public: /* but not really -- don't touch this */
  107. U32 mReferenceCount;
  108. private:
  109. std::string mURL;
  110. };
  111. typedef boost::intrusive_ptr<Responder> ResponderPtr;
  112. /**
  113.  * @ brief Set certificate authority file used to verify HTTPS certs.
  114.  */
  115. static void setCAFile(const std::string& file);
  116. /**
  117.  * @ brief Set certificate authority path used to verify HTTPS certs.
  118.  */
  119. static void setCAPath(const std::string& path);
  120. /**
  121.  * @ brief Return human-readable string describing libcurl version.
  122.  */
  123. static std::string getVersionString();
  124. /**
  125.  * @ brief Get certificate authority file used to verify HTTPS certs.
  126.  */
  127. static const std::string& getCAFile() { return sCAFile; }
  128. /**
  129.  * @ brief Get certificate authority path used to verify HTTPS certs.
  130.  */
  131. static const std::string& getCAPath() { return sCAPath; }
  132. /**
  133.  * @ brief Set flag controlling whether to verify HTTPS certs.
  134.  */
  135. static void setSSLVerify(bool verify);
  136. /**
  137.  * @ brief Get flag controlling whether to verify HTTPS certs.
  138.  */
  139. static bool getSSLVerify();
  140. /**
  141.  * @ brief Initialize LLCurl class
  142.  */
  143. static void initClass();
  144. /**
  145.  * @ brief Cleanup LLCurl class
  146.  */
  147. static void cleanupClass();
  148. /**
  149.  * @ brief curl error code -> string
  150.  */
  151. static std::string strerror(CURLcode errorcode);
  152. // For OpenSSL callbacks
  153. static std::vector<LLMutex*> sSSLMutex;
  154. // OpenSSL callbacks
  155. static void ssl_locking_callback(int mode, int type, const char *file, int line);
  156. static unsigned long ssl_thread_id(void);
  157. private:
  158. static std::string sCAPath;
  159. static std::string sCAFile;
  160. static bool sSSLVerify;
  161. };
  162. namespace boost
  163. {
  164. void intrusive_ptr_add_ref(LLCurl::Responder* p);
  165. void intrusive_ptr_release(LLCurl::Responder* p);
  166. };
  167. class LLCurlRequest
  168. {
  169. public:
  170. typedef std::vector<std::string> headers_t;
  171. LLCurlRequest();
  172. ~LLCurlRequest();
  173. void get(const std::string& url, LLCurl::ResponderPtr responder);
  174. bool getByteRange(const std::string& url, const headers_t& headers, S32 offset, S32 length, LLCurl::ResponderPtr responder);
  175. bool post(const std::string& url, const headers_t& headers, const LLSD& data, LLCurl::ResponderPtr responder);
  176. S32  process();
  177. S32  getQueued();
  178. private:
  179. void addMulti();
  180. LLCurl::Easy* allocEasy();
  181. bool addEasy(LLCurl::Easy* easy);
  182. private:
  183. typedef std::set<LLCurl::Multi*> curlmulti_set_t;
  184. curlmulti_set_t mMultiSet;
  185. LLCurl::Multi* mActiveMulti;
  186. S32 mActiveRequestCount;
  187. U32 mThreadID; // debug
  188. };
  189. class LLCurlEasyRequest
  190. {
  191. public:
  192. LLCurlEasyRequest();
  193. ~LLCurlEasyRequest();
  194. void setopt(CURLoption option, S32 value);
  195. void setoptString(CURLoption option, const std::string& value);
  196. void setPost(char* postdata, S32 size);
  197. void setHeaderCallback(curl_header_callback callback, void* userdata);
  198. void setWriteCallback(curl_write_callback callback, void* userdata);
  199. void setReadCallback(curl_read_callback callback, void* userdata);
  200. void slist_append(const char* str);
  201. void sendRequest(const std::string& url);
  202. void requestComplete();
  203. S32 perform();
  204. bool getResult(CURLcode* result, LLCurl::TransferInfo* info = NULL);
  205. std::string getErrorString();
  206. private:
  207. CURLMsg* info_read(S32* queue, LLCurl::TransferInfo* info);
  208. private:
  209. LLCurl::Multi* mMulti;
  210. LLCurl::Easy* mEasy;
  211. bool mRequestSent;
  212. bool mResultReturned;
  213. };
  214. #endif // LL_LLCURL_H