转一个lua封装libcurl的代码

--curl.h from libcurl 7.46.0
local ffi = require'ffi'

if ffi.abi'win' then
	if ffi.abi'64bit' then
		ffi.cdef'typedef uint64_t UINT_PTR;'
	else
		ffi.cdef'typedef uint32_t UINT_PTR;'
	end
	ffi.cdef[[
		typedef UINT_PTR SOCKET;
		typedef SOCKET curl_socket_t;
	]]
else
	ffi.cdef'typedef int curl_socket_t;'
end

ffi.cdef[[
// curl.h --------------------------------------------------------------------

typedef struct CURL CURL;
typedef void curl_fd_set;
typedef long long curl_off_t;
typedef long time_t;

typedef enum {
	CURLOPT_WRITEDATA = 10000 + 1,
	CURLOPT_URL = 10000 + 2,
	CURLOPT_PORT = 0 + 3,
	CURLOPT_PROXY = 10000 + 4,
	CURLOPT_USERPWD = 10000 + 5,
	CURLOPT_PROXYUSERPWD = 10000 + 6,
	CURLOPT_RANGE = 10000 + 7,
	CURLOPT_READDATA = 10000 + 9,
	CURLOPT_ERRORBUFFER = 10000 + 10,
	CURLOPT_WRITEFUNCTION = 20000 + 11,
	CURLOPT_READFUNCTION = 20000 + 12,
	CURLOPT_TIMEOUT = 0 + 13,
	// CURLOPT_INFILESIZE = 0 + 14,
	CURLOPT_POSTFIELDS = 10000 + 15,
	CURLOPT_REFERER = 10000 + 16,
	CURLOPT_FTPPORT = 10000 + 17,
	CURLOPT_USERAGENT = 10000 + 18,
	CURLOPT_LOW_SPEED_LIMIT = 0 + 19,
	CURLOPT_LOW_SPEED_TIME = 0 + 20,
	// CURLOPT_RESUME_FROM = 0 + 21,
	CURLOPT_COOKIE = 10000 + 22,
	CURLOPT_HTTPHEADER = 10000 + 23,
	CURLOPT_HTTPPOST = 10000 + 24,
	CURLOPT_SSLCERT = 10000 + 25,
	CURLOPT_KEYPASSWD = 10000 + 26,
	CURLOPT_CRLF = 0 + 27,
	CURLOPT_QUOTE = 10000 + 28,
	CURLOPT_HEADERDATA = 10000 + 29,
	CURLOPT_COOKIEFILE = 10000 + 31,
	CURLOPT_SSLVERSION = 0 + 32,
	CURLOPT_TIMECONDITION = 0 + 33,
	CURLOPT_TIMEVALUE = 0 + 34,
	CURLOPT_CUSTOMREQUEST = 10000 + 36,
	CURLOPT_STDERR = 10000 + 37,
	CURLOPT_POSTQUOTE = 10000 + 39,
	CURLOPT_OBSOLETE40 = 10000 + 40,
	CURLOPT_VERBOSE = 0 + 41,
	CURLOPT_HEADER = 0 + 42,
	CURLOPT_NOPROGRESS = 0 + 43,
	CURLOPT_NOBODY = 0 + 44,
	CURLOPT_FAILONERROR = 0 + 45,
	CURLOPT_UPLOAD = 0 + 46,
	CURLOPT_POST = 0 + 47,
	CURLOPT_DIRLISTONLY = 0 + 48,
	CURLOPT_APPEND = 0 + 50,
	CURLOPT_NETRC = 0 + 51,
	CURLOPT_FOLLOWLOCATION = 0 + 52,
	CURLOPT_TRANSFERTEXT = 0 + 53,
	CURLOPT_PUT = 0 + 54,
	CURLOPT_PROGRESSFUNCTION = 20000 + 56,
	CURLOPT_PROGRESSDATA = 10000 + 57,
	CURLOPT_XFERINFODATA = CURLOPT_PROGRESSDATA,
	CURLOPT_AUTOREFERER = 0 + 58,
	CURLOPT_PROXYPORT = 0 + 59,
	// CURLOPT_POSTFIELDSIZE = 0 + 60,
	CURLOPT_HTTPPROXYTUNNEL = 0 + 61,
	CURLOPT_INTERFACE = 10000 + 62,
	CURLOPT_KRBLEVEL = 10000 + 63,
	CURLOPT_SSL_VERIFYPEER = 0 + 64,
	CURLOPT_CAINFO = 10000 + 65,
	CURLOPT_MAXREDIRS = 0 + 68,
	CURLOPT_FILETIME = 0 + 69,
	CURLOPT_TELNETOPTIONS = 10000 + 70,
	CURLOPT_MAXCONNECTS = 0 + 71,
	CURLOPT_OBSOLETE72 = 0 + 72,
	CURLOPT_FRESH_CONNECT = 0 + 74,
	CURLOPT_FORBID_REUSE = 0 + 75,
	CURLOPT_RANDOM_FILE = 10000 + 76,
	CURLOPT_EGDSOCKET = 10000 + 77,
	CURLOPT_CONNECTTIMEOUT = 0 + 78,
	CURLOPT_HEADERFUNCTION = 20000 + 79,
	CURLOPT_HTTPGET = 0 + 80,
	CURLOPT_SSL_VERIFYHOST = 0 + 81,
	CURLOPT_COOKIEJAR = 10000 + 82,
	CURLOPT_SSL_CIPHER_LIST = 10000 + 83,
	CURLOPT_HTTP_VERSION = 0 + 84,
	CURLOPT_FTP_USE_EPSV = 0 + 85,
	CURLOPT_SSLCERTTYPE = 10000 + 86,
	CURLOPT_SSLKEY = 10000 + 87,
	CURLOPT_SSLKEYTYPE = 10000 + 88,
	CURLOPT_SSLENGINE = 10000 + 89,
	CURLOPT_SSLENGINE_DEFAULT = 0 + 90,
	CURLOPT_DNS_USE_GLOBAL_CACHE = 0 + 91,
	CURLOPT_DNS_CACHE_TIMEOUT = 0 + 92,
	CURLOPT_PREQUOTE = 10000 + 93,
	CURLOPT_DEBUGFUNCTION = 20000 + 94,
	CURLOPT_DEBUGDATA = 10000 + 95,
	CURLOPT_COOKIESESSION = 0 + 96,
	CURLOPT_CAPATH = 10000 + 97,
	CURLOPT_BUFFERSIZE = 0 + 98,
	CURLOPT_NOSIGNAL = 0 + 99,
	CURLOPT_SHARE = 10000 + 100,
	CURLOPT_PROXYTYPE = 0 + 101,
	CURLOPT_ACCEPT_ENCODING = 10000 + 102,
	CURLOPT_PRIVATE = 10000 + 103,
	CURLOPT_HTTP200ALIASES = 10000 + 104,
	CURLOPT_UNRESTRICTED_AUTH = 0 + 105,
	CURLOPT_FTP_USE_EPRT = 0 + 106,
	CURLOPT_HTTPAUTH = 0 + 107,
	CURLOPT_SSL_CTX_FUNCTION = 20000 + 108,
	CURLOPT_SSL_CTX_DATA = 10000 + 109,
	CURLOPT_FTP_CREATE_MISSING_DIRS = 0 + 110,
	CURLOPT_PROXYAUTH = 0 + 111,
	CURLOPT_FTP_RESPONSE_TIMEOUT = 0 + 112,
	CURLOPT_SERVER_RESPONSE_TIMEOUT = CURLOPT_FTP_RESPONSE_TIMEOUT,
	CURLOPT_IPRESOLVE = 0 + 113,
	// CURLOPT_MAXFILESIZE = 0 + 114,
	CURLOPT_INFILESIZE = 30000 + 115, // was *_LARGE
	CURLOPT_RESUME_FROM = 30000 + 116, // was *_LARGE
	CURLOPT_MAXFILESIZE = 30000 + 117, // was *_LARGE
	CURLOPT_NETRC_FILE = 10000 + 118,
	CURLOPT_USE_SSL = 0 + 119,
	CURLOPT_POSTFIELDSIZE = 30000 + 120, // was *_LARGE
	CURLOPT_TCP_NODELAY = 0 + 121,
	CURLOPT_FTPSSLAUTH = 0 + 129,
	CURLOPT_IOCTLFUNCTION = 20000 + 130,
	CURLOPT_IOCTLDATA = 10000 + 131,
	CURLOPT_FTP_ACCOUNT = 10000 + 134,
	CURLOPT_COOKIELIST = 10000 + 135,
	CURLOPT_IGNORE_CONTENT_LENGTH = 0 + 136,
	CURLOPT_FTP_SKIP_PASV_IP = 0 + 137,
	CURLOPT_FTP_FILEMETHOD = 0 + 138,
	CURLOPT_LOCALPORT = 0 + 139,
	CURLOPT_LOCALPORTRANGE = 0 + 140,
	CURLOPT_CONNECT_ONLY = 0 + 141,
	CURLOPT_CONV_FROM_NETWORK_FUNCTION = 20000 + 142,
	CURLOPT_CONV_TO_NETWORK_FUNCTION = 20000 + 143,
	CURLOPT_CONV_FROM_UTF8_FUNCTION = 20000 + 144,
	CURLOPT_MAX_SEND_SPEED = 30000 + 145, // was *_LARGE
	CURLOPT_MAX_RECV_SPEED = 30000 + 146, // was *_LARGE
	CURLOPT_FTP_ALTERNATIVE_TO_USER = 10000 + 147,
	CURLOPT_SOCKOPTFUNCTION = 20000 + 148,
	CURLOPT_SOCKOPTDATA = 10000 + 149,
	CURLOPT_SSL_SESSIONID_CACHE = 0 + 150,
	CURLOPT_SSH_AUTH_TYPES = 0 + 151,
	CURLOPT_SSH_PUBLIC_KEYFILE = 10000 + 152,
	CURLOPT_SSH_PRIVATE_KEYFILE = 10000 + 153,
	CURLOPT_FTP_SSL_CCC = 0 + 154,
	CURLOPT_TIMEOUT_MS = 0 + 155,
	CURLOPT_CONNECTTIMEOUT_MS = 0 + 156,
	CURLOPT_HTTP_TRANSFER_DECODING = 0 + 157,
	CURLOPT_HTTP_CONTENT_DECODING = 0 + 158,
	CURLOPT_NEW_FILE_PERMS = 0 + 159,
	CURLOPT_NEW_DIRECTORY_PERMS = 0 + 160,
	CURLOPT_POSTREDIR = 0 + 161,
	CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 = 10000 + 162,
	CURLOPT_OPENSOCKETFUNCTION = 20000 + 163,
	CURLOPT_OPENSOCKETDATA = 10000 + 164,
	CURLOPT_COPYPOSTFIELDS = 10000 + 165,
	CURLOPT_PROXY_TRANSFER_MODE = 0 + 166,
	CURLOPT_SEEKFUNCTION = 20000 + 167,
	CURLOPT_SEEKDATA = 10000 + 168,
	CURLOPT_CRLFILE = 10000 + 169,
	CURLOPT_ISSUERCERT = 10000 + 170,
	CURLOPT_ADDRESS_SCOPE = 0 + 171,
	CURLOPT_CERTINFO = 0 + 172,
	CURLOPT_USERNAME = 10000 + 173,
	CURLOPT_PASSWORD = 10000 + 174,
	CURLOPT_PROXYUSERNAME = 10000 + 175,
	CURLOPT_PROXYPASSWORD = 10000 + 176,
	CURLOPT_NOPROXY = 10000 + 177,
	CURLOPT_TFTP_BLKSIZE = 0 + 178,
	CURLOPT_SOCKS5_GSSAPI_SERVICE = 10000 + 179,
	CURLOPT_SOCKS5_GSSAPI_NEC = 0 + 180,
	CURLOPT_PROTOCOLS = 0 + 181,
	CURLOPT_REDIR_PROTOCOLS = 0 + 182,
	CURLOPT_SSH_KNOWNHOSTS = 10000 + 183,
	CURLOPT_SSH_KEYFUNCTION = 20000 + 184,
	CURLOPT_SSH_KEYDATA = 10000 + 185,
	CURLOPT_MAIL_FROM = 10000 + 186,
	CURLOPT_MAIL_RCPT = 10000 + 187,
	CURLOPT_FTP_USE_PRET = 0 + 188,
	CURLOPT_RTSP_REQUEST = 0 + 189,
	CURLOPT_RTSP_SESSION_ID = 10000 + 190,
	CURLOPT_RTSP_STREAM_URI = 10000 + 191,
	CURLOPT_RTSP_TRANSPORT = 10000 + 192,
	CURLOPT_RTSP_CLIENT_CSEQ = 0 + 193,
	CURLOPT_RTSP_SERVER_CSEQ = 0 + 194,
	CURLOPT_INTERLEAVEDATA = 10000 + 195,
	CURLOPT_INTERLEAVEFUNCTION = 20000 + 196,
	CURLOPT_WILDCARDMATCH = 0 + 197,
	CURLOPT_CHUNK_BGN_FUNCTION = 20000 + 198,
	CURLOPT_CHUNK_END_FUNCTION = 20000 + 199,
	CURLOPT_FNMATCH_FUNCTION = 20000 + 200,
	CURLOPT_CHUNK_DATA = 10000 + 201,
	CURLOPT_FNMATCH_DATA = 10000 + 202,
	CURLOPT_RESOLVE = 10000 + 203,
	CURLOPT_TLSAUTH_USERNAME = 10000 + 204,
	CURLOPT_TLSAUTH_PASSWORD = 10000 + 205,
	CURLOPT_TLSAUTH_TYPE = 10000 + 206,
	CURLOPT_TRANSFER_ENCODING = 0 + 207,
	CURLOPT_CLOSESOCKETFUNCTION = 20000 + 208,
	CURLOPT_CLOSESOCKETDATA = 10000 + 209,
	CURLOPT_GSSAPI_DELEGATION = 0 + 210,
	CURLOPT_DNS_SERVERS = 10000 + 211,
	CURLOPT_ACCEPTTIMEOUT_MS = 0 + 212,
	CURLOPT_TCP_KEEPALIVE = 0 + 213,
	CURLOPT_TCP_KEEPIDLE = 0 + 214,
	CURLOPT_TCP_KEEPINTVL = 0 + 215,
	CURLOPT_SSL_OPTIONS = 0 + 216,
	CURLOPT_MAIL_AUTH = 10000 + 217,
	CURLOPT_SASL_IR = 0 + 218,
	CURLOPT_XFERINFOFUNCTION = 20000 + 219,
	CURLOPT_XOAUTH2_BEARER = 10000 + 220,
	CURLOPT_DNS_INTERFACE = 10000 + 221,
	CURLOPT_DNS_LOCAL_IP4 = 10000 + 222,
	CURLOPT_DNS_LOCAL_IP6 = 10000 + 223,
	CURLOPT_LOGIN_OPTIONS = 10000 + 224,
	CURLOPT_SSL_ENABLE_NPN = 0 + 225,
	CURLOPT_SSL_ENABLE_ALPN = 0 + 226,
	CURLOPT_EXPECT_100_TIMEOUT_MS = 0 + 227,
	CURLOPT_PROXYHEADER = 10000 + 228,
	CURLOPT_HEADEROPT = 0 + 229,
	CURLOPT_PINNEDPUBLICKEY = 10000 + 230,
	CURLOPT_UNIX_SOCKET_PATH = 10000 + 231,
	CURLOPT_SSL_VERIFYSTATUS = 0 + 232,
	CURLOPT_SSL_FALSESTART = 0 + 233,
	CURLOPT_PATH_AS_IS = 0 + 234,
	CURLOPT_PROXY_SERVICE_NAME = 10000 + 235,
	CURLOPT_SERVICE_NAME = 10000 + 236,
	CURLOPT_PIPEWAIT = 0 + 237,
	CURLOPT_DEFAULT_PROTOCOL = 10000 + 238,
	CURLOPT_LASTENTRY
} CURLoption;
enum {
	CURLOPT_POST301      = CURLOPT_POSTREDIR,
	CURLOPT_SSLKEYPASSWD = CURLOPT_KEYPASSWD,
	CURLOPT_FTPAPPEND    = CURLOPT_APPEND,
	CURLOPT_FTPLISTONLY  = CURLOPT_DIRLISTONLY,
	CURLOPT_FTP_SSL      = CURLOPT_USE_SSL,
	CURLOPT_SSLCERTPASSWD = CURLOPT_KEYPASSWD,
	CURLOPT_KRB4LEVEL    = CURLOPT_KRBLEVEL,
	CURL_IPRESOLVE_WHATEVER = 0,
	CURL_IPRESOLVE_V4    = 1,
	CURL_IPRESOLVE_V6    = 2,
	CURLOPT_RTSPHEADER   = CURLOPT_HTTPHEADER,
};
enum {
	CURL_HTTPPOST_FILENAME    = (1<<0),
	CURL_HTTPPOST_READFILE    = (1<<1),
	CURL_HTTPPOST_PTRNAME     = (1<<2),
	CURL_HTTPPOST_PTRCONTENTS = (1<<3),
	CURL_HTTPPOST_BUFFER      = (1<<4),
	CURL_HTTPPOST_PTRBUFFER   = (1<<5),
	CURL_HTTPPOST_CALLBACK    = (1<<6),
	CURL_HTTPPOST_LARGE       = (1<<7),
};
struct curl_httppost {
	struct curl_httppost *next;
	char *name;
	long namelength;
	char *contents;
	long contentslength;
	char *buffer;
	long bufferlength;
	char *contenttype;
	struct curl_slist* contentheader;
	struct curl_httppost *more;
	long flags;
	char *showfilename;
	void *userp;
	curl_off_t contentlen;
};
typedef int (*curl_progress_callback)(void *clientp,
												  double dltotal,
												  double dlnow,
												  double ultotal,
												  double ulnow);
typedef int (*curl_xferinfo_callback)(void *clientp,
												  curl_off_t dltotal,
												  curl_off_t dlnow,
												  curl_off_t ultotal,
												  curl_off_t ulnow);
enum {
	CURL_MAX_WRITE_SIZE  = 16384,
	CURL_MAX_HTTP_HEADER = (100*1024),
	CURL_WRITEFUNC_PAUSE = 0x10000001,
};
typedef size_t (*curl_write_callback)(char *buffer,
												  size_t size,
												  size_t nitems,
												  void *outstream);
typedef enum {
	CURLFILETYPE_FILE = 0,
	CURLFILETYPE_DIRECTORY,
	CURLFILETYPE_SYMLINK,
	CURLFILETYPE_DEVICE_BLOCK,
	CURLFILETYPE_DEVICE_CHAR,
	CURLFILETYPE_NAMEDPIPE,
	CURLFILETYPE_SOCKET,
	CURLFILETYPE_DOOR,
	CURLFILETYPE_UNKNOWN
} curlfiletype;
enum {
	CURLFINFOFLAG_KNOWN_FILENAME = (1<<0),
	CURLFINFOFLAG_KNOWN_FILETYPE = (1<<1),
	CURLFINFOFLAG_KNOWN_TIME = (1<<2),
	CURLFINFOFLAG_KNOWN_PERM = (1<<3),
	CURLFINFOFLAG_KNOWN_UID = (1<<4),
	CURLFINFOFLAG_KNOWN_GID = (1<<5),
	CURLFINFOFLAG_KNOWN_SIZE = (1<<6),
	CURLFINFOFLAG_KNOWN_HLINKCOUNT = (1<<7),
};
struct curl_fileinfo {
  char *filename;
  curlfiletype filetype;
  time_t time;
  unsigned int perm;
  int uid;
  int gid;
  curl_off_t size;
  long int hardlinks;
  struct {
	 char *time;
	 char *perm;
	 char *user;
	 char *group;
	 char *target;
  } strings;
  unsigned int flags;
  char * b_data;
  size_t b_size;
  size_t b_used;
};
enum {
	CURL_CHUNK_BGN_FUNC_OK = 0,
	CURL_CHUNK_BGN_FUNC_FAIL = 1,
	CURL_CHUNK_BGN_FUNC_SKIP = 2,
};
typedef long (*curl_chunk_bgn_callback)(const void *transfer_info,
													 void *ptr,
													 int remains);
enum {
	CURL_CHUNK_END_FUNC_OK = 0,
	CURL_CHUNK_END_FUNC_FAIL = 1,
};
typedef long (*curl_chunk_end_callback)(void *ptr);
enum {
	CURL_FNMATCHFUNC_MATCH = 0,
	CURL_FNMATCHFUNC_NOMATCH = 1,
	CURL_FNMATCHFUNC_FAIL = 2,
};
typedef int (*curl_fnmatch_callback)(void *ptr,
												 const char *pattern,
												 const char *string);
enum {
	CURL_SEEKFUNC_OK     = 0,
	CURL_SEEKFUNC_FAIL   = 1,
	CURL_SEEKFUNC_CANTSEEK = 2,
};
typedef int (*curl_seek_callback)(void *instream,
											 curl_off_t offset,
											 int origin);
enum {
	CURL_READFUNC_ABORT  = 0x10000000,
	CURL_READFUNC_PAUSE  = 0x10000001,
};
typedef size_t (*curl_read_callback)(char *buffer,
												  size_t size,
												  size_t nitems,
												  void *instream);
typedef enum {
  CURLSOCKTYPE_IPCXN,
  CURLSOCKTYPE_ACCEPT,
  CURLSOCKTYPE_LAST
} curlsocktype;
enum {
	CURL_SOCKOPT_OK      = 0,
	CURL_SOCKOPT_ERROR   = 1,
	CURL_SOCKOPT_ALREADY_CONNECTED = 2,
};
typedef int (*curl_sockopt_callback)(void *clientp,
												 curl_socket_t curlfd,
												 curlsocktype purpose);
struct curl_sockaddr {
  int family;
  int socktype;
  int protocol;
  unsigned int addrlen;
};
typedef curl_socket_t
(*curl_opensocket_callback)(void *clientp,
									 curlsocktype purpose,
									 struct curl_sockaddr *address);
typedef int
(*curl_closesocket_callback)(void *clientp, curl_socket_t item);
typedef enum {
	CURLIOE_OK,
	CURLIOE_UNKNOWNCMD,
	CURLIOE_FAILRESTART,
	CURLIOE_LAST
} curlioerr;
typedef enum {
	CURLIOCMD_NOP,
	CURLIOCMD_RESTARTREAD,
	CURLIOCMD_LAST
} curliocmd;
typedef curlioerr (*curl_ioctl_callback)(CURL *handle,
													  int cmd,
													  void *clientp);
typedef void *(*curl_malloc_callback)(size_t size);
typedef void (*curl_free_callback)(void *ptr);
typedef void *(*curl_realloc_callback)(void *ptr, size_t size);
typedef char *(*curl_strdup_callback)(const char *str);
typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size);
typedef enum {
	CURLINFO_TEXT = 0,
	CURLINFO_HEADER_IN,
	CURLINFO_HEADER_OUT,
	CURLINFO_DATA_IN,
	CURLINFO_DATA_OUT,
	CURLINFO_SSL_DATA_IN,
	CURLINFO_SSL_DATA_OUT,
	CURLINFO_END
} curl_infotype;
typedef int (*curl_debug_callback)
		 (CURL *handle,
		  curl_infotype type,
		  char *data,
		  size_t size,
		  void *userptr);
typedef enum {
	CURLE_OK = 0,
	CURLE_UNSUPPORTED_PROTOCOL,
	CURLE_FAILED_INIT,
	CURLE_URL_MALFORMAT,
	CURLE_NOT_BUILT_IN,
	CURLE_COULDNT_RESOLVE_PROXY,
	CURLE_COULDNT_RESOLVE_HOST,
	CURLE_COULDNT_CONNECT,
	CURLE_FTP_WEIRD_SERVER_REPLY,
	CURLE_REMOTE_ACCESS_DENIED,
	CURLE_FTP_ACCEPT_FAILED,
	CURLE_FTP_WEIRD_PASS_REPLY,
	CURLE_FTP_ACCEPT_TIMEOUT,
	CURLE_FTP_WEIRD_PASV_REPLY,
	CURLE_FTP_WEIRD_227_FORMAT,
	CURLE_FTP_CANT_GET_HOST,
	CURLE_HTTP2,
	CURLE_FTP_COULDNT_SET_TYPE,
	CURLE_PARTIAL_FILE,
	CURLE_FTP_COULDNT_RETR_FILE,
	CURLE_OBSOLETE20,
	CURLE_QUOTE_ERROR,
	CURLE_HTTP_RETURNED_ERROR,
	CURLE_WRITE_ERROR,
	CURLE_OBSOLETE24,
	CURLE_UPLOAD_FAILED,
	CURLE_READ_ERROR,
	CURLE_OUT_OF_MEMORY,
	CURLE_OPERATION_TIMEDOUT,
	CURLE_OBSOLETE29,
	CURLE_FTP_PORT_FAILED,
	CURLE_FTP_COULDNT_USE_REST,
	CURLE_OBSOLETE32,
	CURLE_RANGE_ERROR,
	CURLE_HTTP_POST_ERROR,
	CURLE_SSL_CONNECT_ERROR,
	CURLE_BAD_DOWNLOAD_RESUME,
	CURLE_FILE_COULDNT_READ_FILE,
	CURLE_LDAP_CANNOT_BIND,
	CURLE_LDAP_SEARCH_FAILED,
	CURLE_OBSOLETE40,
	CURLE_FUNCTION_NOT_FOUND,
	CURLE_ABORTED_BY_CALLBACK,
	CURLE_BAD_FUNCTION_ARGUMENT,
	CURLE_OBSOLETE44,
	CURLE_INTERFACE_FAILED,
	CURLE_OBSOLETE46,
	CURLE_TOO_MANY_REDIRECTS ,
	CURLE_UNKNOWN_OPTION,
	CURLE_TELNET_OPTION_SYNTAX ,
	CURLE_OBSOLETE50,
	CURLE_PEER_FAILED_VERIFICATION,
	CURLE_GOT_NOTHING,
	CURLE_SSL_ENGINE_NOTFOUND,
	CURLE_SSL_ENGINE_SETFAILED,
	CURLE_SEND_ERROR,
	CURLE_RECV_ERROR,
	CURLE_OBSOLETE57,
	CURLE_SSL_CERTPROBLEM,
	CURLE_SSL_CIPHER,
	CURLE_SSL_CACERT,
	CURLE_BAD_CONTENT_ENCODING,
	CURLE_LDAP_INVALID_URL,
	CURLE_FILESIZE_EXCEEDED,
	CURLE_USE_SSL_FAILED,
	CURLE_SEND_FAIL_REWIND,
	CURLE_SSL_ENGINE_INITFAILED,
	CURLE_LOGIN_DENIED,
	CURLE_TFTP_NOTFOUND,
	CURLE_TFTP_PERM,
	CURLE_REMOTE_DISK_FULL,
	CURLE_TFTP_ILLEGAL,
	CURLE_TFTP_UNKNOWNID,
	CURLE_REMOTE_FILE_EXISTS,
	CURLE_TFTP_NOSUCHUSER,
	CURLE_CONV_FAILED,
	CURLE_CONV_REQD,
	CURLE_SSL_CACERT_BADFILE,
	CURLE_REMOTE_FILE_NOT_FOUND,
	CURLE_SSH,
	CURLE_SSL_SHUTDOWN_FAILED,
	CURLE_AGAIN,
	CURLE_SSL_CRL_BADFILE,
	CURLE_SSL_ISSUER_ERROR,
	CURLE_FTP_PRET_FAILED,
	CURLE_RTSP_CSEQ_ERROR,
	CURLE_RTSP_SESSION_ERROR,
	CURLE_FTP_BAD_FILE_LIST,
	CURLE_CHUNK_FAILED,
	CURLE_NO_CONNECTION_AVAILABLE,
	CURLE_SSL_PINNEDPUBKEYNOTMATCH,
	CURLE_SSL_INVALIDCERTSTATUS,
	CURL_LAST
} CURLcode;
enum {
	CURLE_OBSOLETE16     = CURLE_HTTP2,
	CURLE_OBSOLETE10     = CURLE_FTP_ACCEPT_FAILED,
	CURLE_OBSOLETE12     = CURLE_FTP_ACCEPT_TIMEOUT,
	CURLOPT_ENCODING     = CURLOPT_ACCEPT_ENCODING,
	CURLE_UNKNOWN_TELNET_OPTION = CURLE_UNKNOWN_OPTION,
	CURLE_SSL_PEER_CERTIFICATE = CURLE_PEER_FAILED_VERIFICATION,
	CURLE_OBSOLETE       = CURLE_OBSOLETE50,
	CURLE_BAD_PASSWORD_ENTERED = CURLE_OBSOLETE46,
	CURLE_BAD_CALLING_ORDER = CURLE_OBSOLETE44,
	CURLE_FTP_USER_PASSWORD_INCORRECT = CURLE_OBSOLETE10,
	CURLE_FTP_CANT_RECONNECT = CURLE_OBSOLETE16,
	CURLE_FTP_COULDNT_GET_SIZE = CURLE_OBSOLETE32,
	CURLE_FTP_COULDNT_SET_ASCII = CURLE_OBSOLETE29,
	CURLE_FTP_WEIRD_USER_REPLY = CURLE_OBSOLETE12,
	CURLE_FTP_WRITE_ERROR = CURLE_OBSOLETE20,
	CURLE_LIBRARY_NOT_FOUND = CURLE_OBSOLETE40,
	CURLE_MALFORMAT_USER = CURLE_OBSOLETE24,
	CURLE_SHARE_IN_USE   = CURLE_OBSOLETE57,
	CURLE_URL_MALFORMAT_USER = CURLE_NOT_BUILT_IN,
	CURLE_FTP_ACCESS_DENIED = CURLE_REMOTE_ACCESS_DENIED,
	CURLE_FTP_COULDNT_SET_BINARY = CURLE_FTP_COULDNT_SET_TYPE,
	CURLE_FTP_QUOTE_ERROR = CURLE_QUOTE_ERROR,
	CURLE_TFTP_DISKFULL  = CURLE_REMOTE_DISK_FULL,
	CURLE_TFTP_EXISTS    = CURLE_REMOTE_FILE_EXISTS,
	CURLE_HTTP_RANGE_ERROR = CURLE_RANGE_ERROR,
	CURLE_FTP_SSL_FAILED = CURLE_USE_SSL_FAILED,
	CURLE_OPERATION_TIMEOUTED = CURLE_OPERATION_TIMEDOUT,
	CURLE_HTTP_NOT_FOUND = CURLE_HTTP_RETURNED_ERROR,
	CURLE_HTTP_PORT_FAILED = CURLE_INTERFACE_FAILED,
	CURLE_FTP_COULDNT_STOR_FILE = CURLE_UPLOAD_FAILED,
	CURLE_FTP_PARTIAL_FILE = CURLE_PARTIAL_FILE,
	CURLE_FTP_BAD_DOWNLOAD_RESUME = CURLE_BAD_DOWNLOAD_RESUME,
	CURLE_ALREADY_COMPLETE = 99999,
	CURLOPT_FILE         = CURLOPT_WRITEDATA,
	CURLOPT_INFILE       = CURLOPT_READDATA,
	CURLOPT_WRITEHEADER  = CURLOPT_HEADERDATA,
	CURLOPT_WRITEINFO    = CURLOPT_OBSOLETE40,
	CURLOPT_CLOSEPOLICY  = CURLOPT_OBSOLETE72,
};
typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length);
typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl,
														void *ssl_ctx,
														void *userptr);
typedef enum {
	CURLPROXY_HTTP = 0,
	CURLPROXY_HTTP_1_0 = 1,
	CURLPROXY_SOCKS4 = 4,
	CURLPROXY_SOCKS5 = 5,
	CURLPROXY_SOCKS4A = 6,
	CURLPROXY_SOCKS5_HOSTNAME = 7
} curl_proxytype;
enum {
	CURLAUTH_NONE        = ((unsigned long)0),
	CURLAUTH_BASIC       = (((unsigned long)1)<<0),
	CURLAUTH_DIGEST      = (((unsigned long)1)<<1),
	CURLAUTH_NEGOTIATE   = (((unsigned long)1)<<2),
	CURLAUTH_GSSNEGOTIATE = CURLAUTH_NEGOTIATE,
	CURLAUTH_NTLM        = (((unsigned long)1)<<3),
	CURLAUTH_DIGEST_IE   = (((unsigned long)1)<<4),
	CURLAUTH_NTLM_WB     = (((unsigned long)1)<<5),
	CURLAUTH_ONLY        = (((unsigned long)1)<<31),
	CURLAUTH_ANY         = (~CURLAUTH_DIGEST_IE),
	CURLAUTH_ANYSAFE     = (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE)),
};
enum {
	CURLSSH_AUTH_ANY       = ~0,
	CURLSSH_AUTH_NONE      = 0,
	CURLSSH_AUTH_PUBLICKEY = (1<<0),
	CURLSSH_AUTH_PASSWORD  = (1<<1),
	CURLSSH_AUTH_HOST      = (1<<2),
	CURLSSH_AUTH_KEYBOARD  = (1<<3),
	CURLSSH_AUTH_AGENT     = (1<<4),
	CURLSSH_AUTH_DEFAULT   = CURLSSH_AUTH_ANY,
};
enum {
	CURLGSSAPI_DELEGATION_NONE = 0,
	CURLGSSAPI_DELEGATION_POLICY_FLAG = (1<<0),
	CURLGSSAPI_DELEGATION_FLAG = (1<<1),
	CURL_ERROR_SIZE      = 256,
};
enum curl_khtype {
	CURLKHTYPE_UNKNOWN,
	CURLKHTYPE_RSA1,
	CURLKHTYPE_RSA,
	CURLKHTYPE_DSS
};
struct curl_khkey {
  const char *key;
  size_t len;
  enum curl_khtype keytype;
};
enum curl_khstat {
	CURLKHSTAT_FINE_ADD_TO_FILE,
	CURLKHSTAT_FINE,
	CURLKHSTAT_REJECT,
	CURLKHSTAT_DEFER,
	CURLKHSTAT_LAST
};
enum curl_khmatch {
	CURLKHMATCH_OK,
	CURLKHMATCH_MISMATCH,
	CURLKHMATCH_MISSING,
	CURLKHMATCH_LAST
};
typedef int
  (*curl_sshkeycallback) (CURL *easy,
								  const struct curl_khkey *knownkey,
								  const struct curl_khkey *foundkey,
								  enum curl_khmatch,
								  void *clientp);
typedef enum {
	CURLUSESSL_NONE,
	CURLUSESSL_TRY,
	CURLUSESSL_CONTROL,
	CURLUSESSL_ALL,
	CURLUSESSL_LAST
} curl_usessl;
enum {
	CURLSSLOPT_ALLOW_BEAST = (1<<0),
	CURLSSLOPT_NO_REVOKE = (1<<1),
	CURLFTPSSL_NONE      = CURLUSESSL_NONE,
	CURLFTPSSL_TRY       = CURLUSESSL_TRY,
	CURLFTPSSL_CONTROL   = CURLUSESSL_CONTROL,
	CURLFTPSSL_ALL       = CURLUSESSL_ALL,
	CURLFTPSSL_LAST      = CURLUSESSL_LAST,
};
typedef enum {
	CURLFTPSSL_CCC_NONE,
	CURLFTPSSL_CCC_PASSIVE,
	CURLFTPSSL_CCC_ACTIVE,
	CURLFTPSSL_CCC_LAST
} curl_ftpccc;
typedef enum {
	CURLFTPAUTH_DEFAULT,
	CURLFTPAUTH_SSL,
	CURLFTPAUTH_TLS,
	CURLFTPAUTH_LAST
} curl_ftpauth;
typedef enum {
	CURLFTP_CREATE_DIR_NONE,
	CURLFTP_CREATE_DIR,
	CURLFTP_CREATE_DIR_RETRY,
	CURLFTP_CREATE_DIR_LAST
} curl_ftpcreatedir;
typedef enum {
	CURLFTPMETHOD_DEFAULT,
	CURLFTPMETHOD_MULTICWD,
	CURLFTPMETHOD_NOCWD,
	CURLFTPMETHOD_SINGLECWD,
	CURLFTPMETHOD_LAST
} curl_ftpmethod;
enum {
	CURLHEADER_UNIFIED   = 0,
	CURLHEADER_SEPARATE  = (1<<0),
};
enum {
	CURLPROTO_HTTP       = (1<<0),
	CURLPROTO_HTTPS      = (1<<1),
	CURLPROTO_FTP        = (1<<2),
	CURLPROTO_FTPS       = (1<<3),
	CURLPROTO_SCP        = (1<<4),
	CURLPROTO_SFTP       = (1<<5),
	CURLPROTO_TELNET     = (1<<6),
	CURLPROTO_LDAP       = (1<<7),
	CURLPROTO_LDAPS      = (1<<8),
	CURLPROTO_DICT       = (1<<9),
	CURLPROTO_FILE       = (1<<10),
	CURLPROTO_TFTP       = (1<<11),
	CURLPROTO_IMAP       = (1<<12),
	CURLPROTO_IMAPS      = (1<<13),
	CURLPROTO_POP3       = (1<<14),
	CURLPROTO_POP3S      = (1<<15),
	CURLPROTO_SMTP       = (1<<16),
	CURLPROTO_SMTPS      = (1<<17),
	CURLPROTO_RTSP       = (1<<18),
	CURLPROTO_RTMP       = (1<<19),
	CURLPROTO_RTMPT      = (1<<20),
	CURLPROTO_RTMPE      = (1<<21),
	CURLPROTO_RTMPTE     = (1<<22),
	CURLPROTO_RTMPS      = (1<<23),
	CURLPROTO_RTMPTS     = (1<<24),
	CURLPROTO_GOPHER     = (1<<25),
	CURLPROTO_SMB        = (1<<26),
	CURLPROTO_SMBS       = (1<<27),
	CURLPROTO_ALL        = (~0),
	CURLOPTTYPE_LONG     = 0,
	CURLOPTTYPE_OBJECTPOINT   = 10000,
	CURLOPTTYPE_STRINGPOINT   = 10000,
	CURLOPTTYPE_FUNCTIONPOINT = 20000,
	CURLOPTTYPE_OFF_T         = 30000,
};
enum {
	CURL_HTTP_VERSION_NONE,
	CURL_HTTP_VERSION_1_0,
	CURL_HTTP_VERSION_1_1,
	CURL_HTTP_VERSION_2_0,
	CURL_HTTP_VERSION_LAST
};
enum {
	CURL_RTSPREQ_NONE,
	CURL_RTSPREQ_OPTIONS,
	CURL_RTSPREQ_DESCRIBE,
	CURL_RTSPREQ_ANNOUNCE,
	CURL_RTSPREQ_SETUP,
	CURL_RTSPREQ_PLAY,
	CURL_RTSPREQ_PAUSE,
	CURL_RTSPREQ_TEARDOWN,
	CURL_RTSPREQ_GET_PARAMETER,
	CURL_RTSPREQ_SET_PARAMETER,
	CURL_RTSPREQ_RECORD,
	CURL_RTSPREQ_RECEIVE,
	CURL_RTSPREQ_LAST
};
enum CURL_NETRC_OPTION {
	CURL_NETRC_IGNORED,
	CURL_NETRC_OPTIONAL,
	CURL_NETRC_REQUIRED,
	CURL_NETRC_LAST
};
enum {
	CURL_SSLVERSION_DEFAULT,
	CURL_SSLVERSION_TLSv1,
	CURL_SSLVERSION_SSLv2,
	CURL_SSLVERSION_SSLv3,
	CURL_SSLVERSION_TLSv1_0,
	CURL_SSLVERSION_TLSv1_1,
	CURL_SSLVERSION_TLSv1_2,
	CURL_SSLVERSION_LAST
};
enum CURL_TLSAUTH {
	CURL_TLSAUTH_NONE,
	CURL_TLSAUTH_SRP,
	CURL_TLSAUTH_LAST
};
enum {
	CURL_REDIR_GET_ALL   = 0,
	CURL_REDIR_POST_301  = 1,
	CURL_REDIR_POST_302  = 2,
	CURL_REDIR_POST_303  = 4,
	CURL_REDIR_POST_ALL  = (CURL_REDIR_POST_301|CURL_REDIR_POST_302|CURL_REDIR_POST_303),
};
typedef enum {
	CURL_TIMECOND_NONE,
	CURL_TIMECOND_IFMODSINCE,
	CURL_TIMECOND_IFUNMODSINCE,
	CURL_TIMECOND_LASTMOD,
	CURL_TIMECOND_LAST
} curl_TimeCond;
int (curl_strequal)(const char *s1, const char *s2);
int (curl_strnequal)(const char *s1, const char *s2, size_t n);
typedef enum {
	CURLFORM_NOTHING,
	CURLFORM_COPYNAME,
	CURLFORM_PTRNAME,
	CURLFORM_NAMELENGTH,
	CURLFORM_COPYCONTENTS,
	CURLFORM_PTRCONTENTS,
	CURLFORM_CONTENTSLENGTH,
	CURLFORM_FILECONTENT,
	CURLFORM_ARRAY,
	CURLFORM_OBSOLETE,
	CURLFORM_FILE,
	CURLFORM_BUFFER,
	CURLFORM_BUFFERPTR,
	CURLFORM_BUFFERLENGTH,
	CURLFORM_CONTENTTYPE,
	CURLFORM_CONTENTHEADER,
	CURLFORM_FILENAME,
	CURLFORM_END,
	CURLFORM_OBSOLETE2,
	CURLFORM_STREAM,
	CURLFORM_CONTENTLEN,
	CURLFORM_LASTENTRY
} CURLformoption;
struct curl_forms {
  CURLformoption option;
  const char *value;
};
typedef enum {
	CURL_FORMADD_OK,
	CURL_FORMADD_MEMORY,
	CURL_FORMADD_OPTION_TWICE,
	CURL_FORMADD_NULL,
	CURL_FORMADD_UNKNOWN_OPTION,
	CURL_FORMADD_INCOMPLETE,
	CURL_FORMADD_ILLEGAL_ARRAY,
	CURL_FORMADD_DISABLED,
	CURL_FORMADD_LAST
} CURLFORMcode;
CURLFORMcode curl_formadd(struct curl_httppost **httppost, struct curl_httppost **last_post, ...);
typedef size_t (*curl_formget_callback)(void *arg, const char *buf, size_t len);
int curl_formget(struct curl_httppost *form, void *arg, curl_formget_callback append);
void curl_formfree(struct curl_httppost *form);
char *curl_version(void);
char *curl_easy_escape(CURL *handle, const char *string, int length);
char *curl_escape(const char *string, int length);
char *curl_easy_unescape(CURL *handle, const char *string, int length, int *outlength);
char *curl_unescape(const char *string, int length);
void curl_free(void *p);
CURLcode curl_global_init(long flags);
CURLcode curl_global_init_mem(long flags,
										curl_malloc_callback m,
										curl_free_callback f,
										curl_realloc_callback r,
										curl_strdup_callback s,
										curl_calloc_callback c);
void curl_global_cleanup(void);
struct curl_slist {
  char *data;
  struct curl_slist *next;
};
struct curl_slist *curl_slist_append(struct curl_slist *, const char *);
void curl_slist_free_all(struct curl_slist *);
time_t curl_getdate(const char *p, const time_t *unused);
struct curl_certinfo {
  int num_of_certs;
  struct curl_slist **certinfo;
};
typedef enum {
	CURLSSLBACKEND_NONE = 0,
	CURLSSLBACKEND_OPENSSL = 1,
	CURLSSLBACKEND_GNUTLS = 2,
	CURLSSLBACKEND_NSS = 3,
	CURLSSLBACKEND_OBSOLETE4 = 4,
	CURLSSLBACKEND_GSKIT = 5,
	CURLSSLBACKEND_POLARSSL = 6,
	CURLSSLBACKEND_CYASSL = 7,
	CURLSSLBACKEND_SCHANNEL = 8,
	CURLSSLBACKEND_DARWINSSL = 9,
	CURLSSLBACKEND_AXTLS = 10,
	CURLSSLBACKEND_MBEDTLS = 11
} curl_sslbackend;
struct curl_tlssessioninfo {
  curl_sslbackend backend;
  void *internals;
};
enum {
	CURLINFO_STRING      = 0x100000,
	CURLINFO_LONG        = 0x200000,
	CURLINFO_DOUBLE      = 0x300000,
	CURLINFO_SLIST       = 0x400000,
	CURLINFO_SOCKET      = 0x500000,
	CURLINFO_MASK        = 0x0fffff,
	CURLINFO_TYPEMASK    = 0xf00000,
};
typedef enum {
	CURLINFO_NONE,
	CURLINFO_EFFECTIVE_URL = 0x100000 + 1,
	CURLINFO_RESPONSE_CODE = 0x200000 + 2,
	CURLINFO_TOTAL_TIME = 0x300000 + 3,
	CURLINFO_NAMELOOKUP_TIME = 0x300000 + 4,
	CURLINFO_CONNECT_TIME = 0x300000 + 5,
	CURLINFO_PRETRANSFER_TIME = 0x300000 + 6,
	CURLINFO_SIZE_UPLOAD = 0x300000 + 7,
	CURLINFO_SIZE_DOWNLOAD = 0x300000 + 8,
	CURLINFO_SPEED_DOWNLOAD = 0x300000 + 9,
	CURLINFO_SPEED_UPLOAD = 0x300000 + 10,
	CURLINFO_HEADER_SIZE = 0x200000 + 11,
	CURLINFO_REQUEST_SIZE = 0x200000 + 12,
	CURLINFO_SSL_VERIFYRESULT = 0x200000 + 13,
	CURLINFO_FILETIME = 0x200000 + 14,
	CURLINFO_CONTENT_LENGTH_DOWNLOAD = 0x300000 + 15,
	CURLINFO_CONTENT_LENGTH_UPLOAD = 0x300000 + 16,
	CURLINFO_STARTTRANSFER_TIME = 0x300000 + 17,
	CURLINFO_CONTENT_TYPE = 0x100000 + 18,
	CURLINFO_REDIRECT_TIME = 0x300000 + 19,
	CURLINFO_REDIRECT_COUNT = 0x200000 + 20,
	CURLINFO_PRIVATE = 0x100000 + 21,
	CURLINFO_HTTP_CONNECTCODE = 0x200000 + 22,
	CURLINFO_HTTPAUTH_AVAIL = 0x200000 + 23,
	CURLINFO_PROXYAUTH_AVAIL = 0x200000 + 24,
	CURLINFO_OS_ERRNO = 0x200000 + 25,
	CURLINFO_NUM_CONNECTS = 0x200000 + 26,
	CURLINFO_SSL_ENGINES = 0x400000 + 27,
	CURLINFO_COOKIELIST = 0x400000 + 28,
	CURLINFO_LASTSOCKET = 0x200000 + 29,
	CURLINFO_FTP_ENTRY_PATH = 0x100000 + 30,
	CURLINFO_REDIRECT_URL = 0x100000 + 31,
	CURLINFO_PRIMARY_IP = 0x100000 + 32,
	CURLINFO_APPCONNECT_TIME = 0x300000 + 33,
	CURLINFO_CERTINFO = 0x400000 + 34,
	CURLINFO_CONDITION_UNMET = 0x200000 + 35,
	CURLINFO_RTSP_SESSION_ID = 0x100000 + 36,
	CURLINFO_RTSP_CLIENT_CSEQ = 0x200000 + 37,
	CURLINFO_RTSP_SERVER_CSEQ = 0x200000 + 38,
	CURLINFO_RTSP_CSEQ_RECV = 0x200000 + 39,
	CURLINFO_PRIMARY_PORT = 0x200000 + 40,
	CURLINFO_LOCAL_IP = 0x100000 + 41,
	CURLINFO_LOCAL_PORT = 0x200000 + 42,
	CURLINFO_TLS_SESSION = 0x400000 + 43,
	CURLINFO_ACTIVESOCKET = 0x500000 + 44,
	CURLINFO_LASTONE = 44
} CURLINFO;
enum {
	CURLINFO_HTTP_CODE   = CURLINFO_RESPONSE_CODE,
};
typedef enum {
	CURLCLOSEPOLICY_NONE,
	CURLCLOSEPOLICY_OLDEST,
	CURLCLOSEPOLICY_LEAST_RECENTLY_USED,
	CURLCLOSEPOLICY_LEAST_TRAFFIC,
	CURLCLOSEPOLICY_SLOWEST,
	CURLCLOSEPOLICY_CALLBACK,
	CURLCLOSEPOLICY_LAST
} curl_closepolicy;
enum {
	CURL_GLOBAL_SSL      = (1<<0),
	CURL_GLOBAL_WIN32    = (1<<1),
	CURL_GLOBAL_ALL      = (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32),
	CURL_GLOBAL_NOTHING  = 0,
	CURL_GLOBAL_DEFAULT  = CURL_GLOBAL_ALL,
	CURL_GLOBAL_ACK_EINTR = (1<<2),
};
typedef enum {
	CURL_LOCK_DATA_NONE = 0,
	CURL_LOCK_DATA_SHARE,
	CURL_LOCK_DATA_COOKIE,
	CURL_LOCK_DATA_DNS,
	CURL_LOCK_DATA_SSL_SESSION,
	CURL_LOCK_DATA_CONNECT,
	CURL_LOCK_DATA_LAST
} curl_lock_data;
typedef enum {
	CURL_LOCK_ACCESS_NONE = 0,
	CURL_LOCK_ACCESS_SHARED = 1,
	CURL_LOCK_ACCESS_SINGLE = 2,
	CURL_LOCK_ACCESS_LAST
} curl_lock_access;
typedef void (*curl_lock_function)(CURL *handle,
											  curl_lock_data data,
											  curl_lock_access locktype,
											  void *userptr);
typedef void (*curl_unlock_function)(CURL *handle,
												 curl_lock_data data,
												 void *userptr);
typedef struct CURLSH CURLSH;
typedef enum {
	CURLSHE_OK,
	CURLSHE_BAD_OPTION,
	CURLSHE_IN_USE,
	CURLSHE_INVALID,
	CURLSHE_NOMEM,
	CURLSHE_NOT_BUILT_IN,
	CURLSHE_LAST
} CURLSHcode;
typedef enum {
	CURLSHOPT_NONE,
	CURLSHOPT_SHARE,
	CURLSHOPT_UNSHARE,
	CURLSHOPT_LOCKFUNC,
	CURLSHOPT_UNLOCKFUNC,
	CURLSHOPT_USERDATA,
	CURLSHOPT_LAST
} CURLSHoption;
CURLSH *curl_share_init(void);
CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...);
CURLSHcode curl_share_cleanup(CURLSH *);
typedef enum {
	CURLVERSION_FIRST,
	CURLVERSION_SECOND,
	CURLVERSION_THIRD,
	CURLVERSION_FOURTH,
	CURLVERSION_LAST
} CURLversion;
enum {
	CURLVERSION_NOW      = CURLVERSION_FOURTH,
};
typedef struct {
  CURLversion age;
  const char *version;
  unsigned int version_num;
  const char *host;
  int features;
  const char *ssl_version;
  long ssl_version_num;
  const char *libz_version;
  const char * const *protocols;
  const char *ares;
  int ares_num;
  const char *libidn;
  int iconv_ver_num;
  const char *libssh_version;
} curl_version_info_data;
enum {
	CURL_VERSION_IPV6    = (1<<0),
	CURL_VERSION_KERBEROS4 = (1<<1),
	CURL_VERSION_SSL     = (1<<2),
	CURL_VERSION_LIBZ    = (1<<3),
	CURL_VERSION_NTLM    = (1<<4),
	CURL_VERSION_GSSNEGOTIATE = (1<<5),
	CURL_VERSION_DEBUG   = (1<<6),
	CURL_VERSION_ASYNCHDNS = (1<<7),
	CURL_VERSION_SPNEGO  = (1<<8),
	CURL_VERSION_LARGEFILE = (1<<9),
	CURL_VERSION_IDN     = (1<<10),
	CURL_VERSION_SSPI    = (1<<11),
	CURL_VERSION_CONV    = (1<<12),
	CURL_VERSION_CURLDEBUG = (1<<13),
	CURL_VERSION_TLSAUTH_SRP = (1<<14),
	CURL_VERSION_NTLM_WB = (1<<15),
	CURL_VERSION_HTTP2   = (1<<16),
	CURL_VERSION_GSSAPI  = (1<<17),
	CURL_VERSION_KERBEROS5 = (1<<18),
	CURL_VERSION_UNIX_SOCKETS = (1<<19),
};
curl_version_info_data *curl_version_info(CURLversion);

// easy.h --------------------------------------------------------------------

const char *curl_easy_strerror(CURLcode);
const char *curl_share_strerror(CURLSHcode);
CURLcode curl_easy_pause(CURL *handle, int bitmask);
enum {
	CURLPAUSE_RECV       = (1<<0),
	CURLPAUSE_RECV_CONT  = (0),
	CURLPAUSE_SEND       = (1<<2),
	CURLPAUSE_SEND_CONT  = (0),
	CURLPAUSE_ALL        = (CURLPAUSE_RECV|CURLPAUSE_SEND),
	CURLPAUSE_CONT       = (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT),
};

CURL *curl_easy_init(void);
CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
CURLcode curl_easy_perform(CURL *curl);
void curl_easy_cleanup(CURL *curl);
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
CURL* curl_easy_duphandle(CURL *curl);
void curl_easy_reset(CURL *curl);
CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen,
												size_t *n);
CURLcode curl_easy_send(CURL *curl, const void *buffer,
												size_t buflen, size_t *n);

// multi.h -------------------------------------------------------------------

typedef struct CURLM CURLM;
typedef enum {
	CURLM_CALL_MULTI_PERFORM = -1,
	CURLM_OK,
	CURLM_BAD_HANDLE,
	CURLM_BAD_EASY_HANDLE,
	CURLM_OUT_OF_MEMORY,
	CURLM_INTERNAL_ERROR,
	CURLM_BAD_SOCKET,
	CURLM_UNKNOWN_OPTION,
	CURLM_ADDED_ALREADY,
	CURLM_LAST
} CURLMcode;
enum {
	CURLM_CALL_MULTI_SOCKET = CURLM_CALL_MULTI_PERFORM,
	CURLPIPE_NOTHING     = 0,
	CURLPIPE_HTTP1       = 1,
	CURLPIPE_MULTIPLEX   = 2,
};
typedef enum {
	CURLMSG_NONE,
	CURLMSG_DONE,
	CURLMSG_LAST
} CURLMSG;
struct CURLMsg {
  CURLMSG msg;
  CURL *easy_handle;
  union {
	 void *whatever;
	 CURLcode result;
  } data;
};
typedef struct CURLMsg CURLMsg;
enum {
	CURL_WAIT_POLLIN     = 0x0001,
	CURL_WAIT_POLLPRI    = 0x0002,
	CURL_WAIT_POLLOUT    = 0x0004,
};
struct curl_waitfd {
  curl_socket_t fd;
  short events;
  short revents;
};
CURLM *curl_multi_init(void);
CURLMcode curl_multi_add_handle(CURLM *multi_handle, CURL *curl_handle);
CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *curl_handle);
CURLMcode curl_multi_fdset(CURLM *multi_handle,
													curl_fd_set *read_fd_set,
													curl_fd_set *write_fd_set,
													curl_fd_set *exc_fd_set,
													int *max_fd);
CURLMcode curl_multi_wait(CURLM *multi_handle,
												  struct curl_waitfd extra_fds[],
												  unsigned int extra_nfds,
												  int timeout_ms,
												  int *ret);
CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles);
CURLMcode curl_multi_cleanup(CURLM *multi_handle);
CURLMsg *curl_multi_info_read(CURLM *multi_handle, int *msgs_in_queue);
const char *curl_multi_strerror(CURLMcode);
enum {
	CURL_POLL_NONE       = 0,
	CURL_POLL_IN         = 1,
	CURL_POLL_OUT        = 2,
	CURL_POLL_INOUT      = 3,
	CURL_POLL_REMOVE     = 4,
	CURL_CSELECT_IN      = 0x01,
	CURL_CSELECT_OUT     = 0x02,
	CURL_CSELECT_ERR     = 0x04,
};
typedef int (*curl_socket_callback)(CURL *easy, curl_socket_t s, int what, void *userp, void *socketp);
typedef int (*curl_multi_timer_callback)(CURLM *multi, long timeout_ms, void *userp);
CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s, int *running_handles);
CURLMcode curl_multi_socket_action(CURLM *multi_handle, curl_socket_t s, int ev_bitmask, int *running_handles);
CURLMcode curl_multi_socket_all(CURLM *multi_handle, int *running_handles);
CURLMcode curl_multi_timeout(CURLM *multi_handle, long *milliseconds);
typedef enum {
	CURLMOPT_SOCKETFUNCTION = 20000 + 1,
	CURLMOPT_SOCKETDATA = 10000 + 2,
	CURLMOPT_PIPELINING = 0 + 3,
	CURLMOPT_TIMERFUNCTION = 20000 + 4,
	CURLMOPT_TIMERDATA = 10000 + 5,
	CURLMOPT_MAXCONNECTS = 0 + 6,
	CURLMOPT_MAX_HOST_CONNECTIONS = 0 + 7,
	CURLMOPT_MAX_PIPELINE_LENGTH = 0 + 8,
	CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE = 30000 + 9,
	CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE = 30000 + 10,
	CURLMOPT_PIPELINING_SITE_BL = 10000 + 11,
	CURLMOPT_PIPELINING_SERVER_BL = 10000 + 12,
	CURLMOPT_MAX_TOTAL_CONNECTIONS = 0 + 13,
	CURLMOPT_PUSHFUNCTION = 20000 + 14,
	CURLMOPT_PUSHDATA = 10000 + 15,
	CURLMOPT_LASTENTRY
} CURLMoption;
CURLMcode curl_multi_setopt(CURLM *multi_handle, CURLMoption option, ...);
CURLMcode curl_multi_assign(CURLM *multi_handle, curl_socket_t sockfd, void *sockp);
enum {
	CURL_PUSH_OK         = 0,
	CURL_PUSH_DENY       = 1,
};
struct curl_pushheaders;
char *curl_pushheader_bynum(struct curl_pushheaders *h, size_t num);
char *curl_pushheader_byname(struct curl_pushheaders *h, const char *name);
typedef int (*curl_push_callback)(CURL *parent,
											 CURL *easy,
											 size_t num_headers,
											 struct curl_pushheaders *headers,
											 void *userp);
]]

 

转载于:https://my.oschina.net/u/2385183/blog/689534

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值