您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-X 节点(curl.h)API

2013-11-08 10:36 941 查看
本文来自http://blog.csdn.net/runaying ,引用必须注明出处!

cocos2d-X 节点(curl.h)API

温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记

///cocos2d-x-3.0alpha0/cocos2dx/platform/third_party/ios/curl
#ifndef __CURL_CURL_H
#define __CURL_CURL_H

/*
* 如果您有 libcurl 方面的问题,所有的文档和细节在这里找到:
*   http://curl.haxx.se/libcurl/ *
* curl-library 你可以访问下面的 web 页面订阅和退订邮件:
*   http://cool.haxx.se/mailman/listinfo/curl-library/ */

#include "curlver.h"         /* libcurl 版本定义   */
#include "curlbuild.h"       /* libcurl 构建定义 */
#include "curlrules.h"       /* libcurl 规则定义 */

/*
* 定义 Win32 ,当构建目标是 Win32 API
*/

#if (defined(_WIN32) || defined(__WIN32__)) && \
!defined(WIN32) && !defined(__SYMBIAN32__)
#define WIN32
#endif

#include <stdio.h>
#include <limits.h>

#if defined(__FreeBSD__) && (__FreeBSD__ >= 2)
/* 需要__ FreeBSD_version中的标记定义*/
#include <osreldate.h>
#endif

/* 这里包含下面的东西,其主要是 time_t! */
#include <sys/types.h>
#include <time.h>

#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__)
#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || defined(__LWIP_OPT_H__))
/* 检查 winsock2 包含的内容在 winsock.h 里面是否已经存在,因为他们不能在没有问题的时候共存
*/
#include <winsock2.h>
#include <ws2tcpip.h>
#endif
#endif

/* HP-UX 系统版本是 9, 因为 10 、 11 缺少 sys/select.h 所以基于
libc5-based Linux 系统不过时. 我们需要系统包含它(sys/select.h)!
*/
#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \
defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \
defined(ANDROID) || defined(__ANDROID__) || \
(defined(__FreeBSD_version) && (__FreeBSD_version < 800000))
#include <sys/select.h>
#endif

#if !defined(WIN32) && !defined(_WIN32_WCE)
#include <sys/socket.h>
#endif

#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__)
#include <sys/time.h>
#endif

#ifdef __BEOS__
#include <support/SupportDefs.h>
#endif

#ifdef  __cplusplus
extern "C" {
#endif

typedef void CURL;

/*
* Win32 、 Symbian OS DLL 链接的装饰到处功能.
* 避免使用 .def 文件构建 libcurl.dll.
*/
#if (defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__)) && \
!defined(CURL_STATICLIB)
#if defined(BUILDING_LIBCURL)
#define CURL_EXTERN  __declspec(dllexport)
#else
#define CURL_EXTERN  __declspec(dllimport)
#endif
#else

#ifdef CURL_HIDDEN_SYMBOLS
/*
* 默认 symbols 是隐藏的,这个定义可以让外部共享库可见
*
* 编译 library 后,再编译应用程序时,是否设置与否,都没有区别,.
*/
#define CURL_EXTERN CURL_EXTERN_SYMBOL
#else
#define CURL_EXTERN
#endif
#endif

#ifndef curl_socket_typedef
/* socket typedef */
#if defined(WIN32) && !defined(__LWIP_OPT_H__)
typedef SOCKET curl_socket_t;
#define CURL_SOCKET_BAD INVALID_SOCKET
#else
typedef int curl_socket_t;
#define CURL_SOCKET_BAD -1
#endif
#define curl_socket_typedef
#endif /* curl_socket_typedef */

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; /* 这种样式的附加头列表(www.、 http://、https:// ) */
struct curl_httppost *more;       /* 如果一个字段名不止指向一个文件,这个链接应该链接到这些文件
*/
long flags;                       /* 在下面定义 */
#define HTTPPOST_FILENAME (1<<0)    /* 指定的内容是文件名 */
#define HTTPPOST_READFILE (1<<1)    /* 指定的内容是文件名 */
#define HTTPPOST_PTRNAME (1<<2)     /* 只存储名字指针
formfree 不是空闲(free)的*/
#define HTTPPOST_PTRCONTENTS (1<<3) /* 只存储 内容指针
formfree 不是空闲(free)的 */
#define HTTPPOST_BUFFER (1<<4)      /* 从缓冲区上传文件 */
#define HTTPPOST_PTRBUFFER (1<<5)   /* 从指针内容上传文件 */
#define HTTPPOST_CALLBACK (1<<6)    /* 通过常规的读 callback 获取数据,上传给定指针指向的文件内容
*/

char *showfilename;               /* T要显示的文件名he file name to show. 如果没有设置将使用真实的文件名, (如果这是文件的一部分)
*/
void *userp;                      /* 自定义指针使用了 HTTPPOST_CALLBACK posts
*/
};

typedef int (*curl_progress_callback)(void *clientp,
double dltotal,
double dlnow,
double ultotal,
double ulnow);

#ifndef CURL_MAX_WRITE_SIZE
/* 实验证明 20 k 在 windosw 上是一个糟糕的上载缓冲区大小,一些奇怪的原因 16k 表现好了很多。我们的 ifndef 检查,允许该值更容易被那些爱冒险的人改变改变
实际上最小值大概是 400 bytes,自 libcurl 使用一个 buffer 它的大小从无到有(和网络发送操作无关).
*/
#define CURL_MAX_WRITE_SIZE 16384
#endif

#ifndef CURL_MAX_HTTP_HEADER
/* 有一个风险是应该避免的,使用 libcurl 的一个never-ending 的 header 可能会导致服务器无限循环的执行一个请求
*/
#define CURL_MAX_HTTP_HEADER (100*1024)
#endif

/* return 一个有魔力的 write callback ,返回时,libcurl 会收到暂停接受当前传输的信号
*/
#define 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, /* 现在可能只在 Sun Solaris */

CURLFILETYPE_UNKNOWN /* 应该永远不会发生 */
} curlfiletype;

#define CURLFINFOFLAG_KNOWN_FILENAME    (1<<0)
#define CURLFINFOFLAG_KNOWN_FILETYPE    (1<<1)
#define CURLFINFOFLAG_KNOWN_TIME        (1<<2)
#define CURLFINFOFLAG_KNOWN_PERM        (1<<3)
#define CURLFINFOFLAG_KNOWN_UID         (1<<4)
#define CURLFINFOFLAG_KNOWN_GID         (1<<5)
#define CURLFINFOFLAG_KNOWN_SIZE        (1<<6)
#define CURLFINFOFLAG_KNOWN_HLINKCOUNT  (1<<7)

/* 结构体里面的内容依赖于现实中的已知的信息 (e.g. 通过 FTP LIST 解析). 请看 url_easy_setopt(3)手册这个结构体的 callbacks returning  -- 一些字段是强制性的,
另一些字段是可选的。标志字段具有特殊的意义. */
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 {
/* 如果一些字段不为 NULL, 他是一个指向 b_data 的指针. */
char *time;
char *perm;
char *user;
char *group;
char *target; /* 一个指向 symlink 目标文件名的指针 */
} strings;

unsigned int flags;

/* 内部使用 */
char * b_data;
size_t b_size;
size_t b_used;
};

/* return  CURLOPT_CHUNK_BGN_FUNCTION 功能的代码*/
#define CURL_CHUNK_BGN_FUNC_OK      0
#define CURL_CHUNK_BGN_FUNC_FAIL    1 /* 告诉的lib结束任务 */
#define CURL_CHUNK_BGN_FUNC_SKIP    2 /* 跳过这个块 */

/*  如果启用了数据分割传输,那么开始一个单独数据块下载前这个 callback 被调用
请注意 "remains" 参数,只在 FTP 通配符,下载时使用,其他情况不使用
*/
typedef long (*curl_chunk_bgn_callback)(const void *transfer_info,
void *ptr,
int remains);

/* return CURLOPT_CHUNK_END_FUNCTION 功能的代码*/
#define CURL_CHUNK_END_FUNC_OK      0
#define CURL_CHUNK_END_FUNC_FAIL    1 /* 告诉的lib结束任务 */

/* 如果启用了数据分割传输 ,如果启用了数据分割传输,那么结束一个单独数据块下载后这个 callback 被调用.
请注意! 所有的快都会调用这个回调函数.
即使这个下载块在 CHUNK_BGN_FUNC 里面被跳过了。.
这就是为什么我们故需要 "transfer_info" 参数 ,为什么我们不关心 "remains" 参数的原因. */
typedef long (*curl_chunk_end_callback)(void *ptr);

/* return  FNMATCHFUNCTION 功能的代码 */
#define CURL_FNMATCHFUNC_MATCH    0 /* 字符串对应的模式 */
#define CURL_FNMATCHFUNC_NOMATCH  1 /* 模式不匹配的字符串 */
#define CURL_FNMATCHFUNC_FAIL     2 /* 发生了错误 */

/* 通配符下载模式匹配的回调类型.
字符串匹配的模式, return CURL_FNMATCHFUNC_MATCH 值, etc. */
typedef int (*curl_fnmatch_callback)(void *ptr,
const char *pattern,
const char *string);

/* 这些返回代码是关于 seek(请求) callbacks */
#define CURL_SEEKFUNC_OK       0
#define CURL_SEEKFUNC_FAIL     1 /* 整个传输失败 */
#define CURL_SEEKFUNC_CANTSEEK 2 /* 告诉 libcurl (请求)seeking 不可达,
所以 libcurl 可能尝试其它的方法来代替 */
typedef int (*curl_seek_callback)(void *instream,
curl_off_t offset,
int origin); /* 'whence' */   ;// 和出

/*一个 read callback ,返回时,libcurl 会收到立即中止当前传输的信号
*/
#define CURL_READFUNC_ABORT 0x10000000
/* 一个 read callback ,返回时,libcurl 会收到暂停发送数据当前传输的信号 . */
#define CURL_READFUNC_PAUSE 0x10000001

typedef size_t (*curl_read_callback)(char *buffer,
size_t size,
size_t nitems,
void *instream);

typedef enum  {
CURLSOCKTYPE_IPCXN, /* 创建一个特定的IP连接的插座 socket */
CURLSOCKTYPE_LAST   /* never use */
} curlsocktype;

/* 返回 libcurl  sockopt_callback 的信号信息: */
#define CURL_SOCKOPT_OK 0
#define CURL_SOCKOPT_ERROR 1 /* 导致libcurl的中止,并返回
CURLE_ABORTED_BY_CALLBACK */
#define 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; /*  addrlen 是一个 socklen_t 类型,在7.780 前缺少这种类型
turned 信息非常难懂
*/
struct sockaddr addr;
};

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,            /* I/O 操作成功 */
CURLIOE_UNKNOWNCMD,    /* 命令是未知的回调*/
CURLIOE_FAILRESTART,   /* 未能重新读取 */
CURLIOE_LAST           /* never use */
} curlioerr;

typedef enum  {
CURLIOCMD_NOP,         /* 无操作*/
CURLIOCMD_RESTARTREAD, /* 重新启动读取流 */
CURLIOCMD_LAST         /* never use */
} curliocmd;

typedef curlioerr (*curl_ioctl_callback)(CURL *handle,
int cmd,
void *clientp);

/*
* 下列 typedef's 签名包括 malloc, free, realloc, strdup and
* calloc respectively. 这些类型的函数指针可以被传递到
* curl_global_init_mem() 函数来设置用户定义的内存管理回调程序。
*/
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);

/* 数据类型传递给 information_callback*/
typedef enum {
CURLINFO_TEXT = 0,
CURLINFO_HEADER_IN,    /* 1 */
CURLINFO_HEADER_OUT,   /* 2 */
CURLINFO_DATA_IN,      /* 3 */
CURLINFO_DATA_OUT,     /* 4 */
CURLINFO_SSL_DATA_IN,  /* 5 */
CURLINFO_SSL_DATA_OUT, /* 6 */
CURLINFO_END
} curl_infotype;

typedef int (*curl_debug_callback)
(CURL *handle,      /* 这涉及 处理/传输 */
curl_infotype type, /* 什么类型的数据 */
char *data,        /* 指向数据*/
size_t size,       /* 数据大小   */
void *userptr);    /* 请求的任何用户 */

/* 所有可能的 curl 功能错误代码种类
未来的版本可能返回其他值, 留的准备。

最后随时添加新的返回代码. 从不* EVER *删除。返回
代码必须保持一致!
*/

typedef enum {
CURLE_OK = 0,
CURLE_UNSUPPORTED_PROTOCOL,    /* 1 */
CURLE_FAILED_INIT,             /* 2 */
CURLE_URL_MALFORMAT,           /* 3 */
CURLE_NOT_BUILT_IN,            /* 4 - [2007年8月过时, 在2011年4月,重用] */
CURLE_COULDNT_RESOLVE_PROXY,   /* 5 */
CURLE_COULDNT_RESOLVE_HOST,    /* 6 */
CURLE_COULDNT_CONNECT,         /* 7 */
CURLE_FTP_WEIRD_SERVER_REPLY,  /* 8 */
CURLE_REMOTE_ACCESS_DENIED,    /* 9 由服务器拒绝服务
由于无法进入 - 登录失败时不返回. */
CURLE_FTP_ACCEPT_FAILED,       /* 10 - [已过时,在2006年4月
, 在2011年12月12日]*/
CURLE_FTP_WEIRD_PASS_REPLY,    /* 11 */
CURLE_FTP_ACCEPT_TIMEOUT,      /* 12 - 服务器受理超时
[已过时,在2007年8月,
r 2011年12月重用]*/
CURLE_FTP_WEIRD_PASV_REPLY,    /* 13 */
CURLE_FTP_WEIRD_227_FORMAT,    /* 14 */
CURLE_FTP_CANT_GET_HOST,       /* 15 */
CURLE_OBSOLETE16,              /* 16 - NOT USED */
CURLE_FTP_COULDNT_SET_TYPE,    /* 17 */
CURLE_PARTIAL_FILE,            /* 18 */
CURLE_FTP_COULDNT_RETR_FILE,   /* 19 */
CURLE_OBSOLETE20,              /* 20 - NOT USED */
CURLE_QUOTE_ERROR,             /* 21 - quote command failure */
CURLE_HTTP_RETURNED_ERROR,     /* 22 */
CURLE_WRITE_ERROR,             /* 23 */
CURLE_OBSOLETE24,              /* 24 - NOT USED */
CURLE_UPLOAD_FAILED,           /* 25 - 上传失败 "command" */
CURLE_READ_ERROR,              /* 26 - 无法打开/读取 文件*/
CURLE_OUT_OF_MEMORY,           /* 27 */
/* Note: CURLE_OUT_OF_MEMORY 有时会显示转换错误
而不是内存分配错误,如果 CURL_DOES_CONVERSIONS
被定义
*/
CURLE_OPERATION_TIMEDOUT,      /* 28 - 超时了仍未到达 */
CURLE_OBSOLETE29,              /* 29 - NOT USED */
CURLE_FTP_PORT_FAILED,         /* 30 - FTP端口操作失败 */
CURLE_FTP_COULDNT_USE_REST,    /* 31 - REST命令失败 */
CURLE_OBSOLETE32,              /* 32 - NOT USED */
CURLE_RANGE_ERROR,             /* 33 - 范围 "command" 没有工作*/
CURLE_HTTP_POST_ERROR,         /* 34 */
CURLE_SSL_CONNECT_ERROR,       /* 35 - 使用 SSL 链接时发生错误*/
CURLE_BAD_DOWNLOAD_RESUME,     /* 36 - 无法恢复下载 */
CURLE_FILE_COULDNT_READ_FILE,  /* 37 */
CURLE_LDAP_CANNOT_BIND,        /* 38 */
CURLE_LDAP_SEARCH_FAILED,      /* 39 */
CURLE_OBSOLETE40,              /* 40 - NOT USED */
CURLE_FUNCTION_NOT_FOUND,      /* 41 */
CURLE_ABORTED_BY_CALLBACK,     /* 42 */
CURLE_BAD_FUNCTION_ARGUMENT,   /* 43 */
CURLE_OBSOLETE44,              /* 44 - NOT USED */
CURLE_INTERFACE_FAILED,        /* 45 - CURLOPT_INTERFACE 的失败 */
CURLE_OBSOLETE46,              /* 46 - NOT USED */
CURLE_TOO_MANY_REDIRECTS ,     /* 47 - 赶上无尽的 re-direct 循环 */
CURLE_UNKNOWN_OPTION,          /* 48 - 用户指定了一个未知的选项 */
CURLE_TELNET_OPTION_SYNTAX ,   /* 49 - 格式不正确的telnet选项 */
CURLE_OBSOLETE50,              /* 50 - NOT USED */
CURLE_PEER_FAILED_VERIFICATION, /* 51 - 对方的证书或指纹
没有验证好 */
CURLE_GOT_NOTHING,             /* 52 - 这是一个特定的错误 */
CURLE_SSL_ENGINE_NOTFOUND,      /* 53 - SSL加密引擎没有找到*/
CURLE_SSL_ENGINE_SETFAILED,     /* 54 -可以不设置SSL加密引擎
默认值*/
CURLE_SEND_ERROR,               /* 55 -无法发送网络数据*/
CURLE_RECV_ERROR,               /* 56 -未能接收网络数据*/
CURLE_OBSOLETE57,              /* 57 - NOT IN USE */
CURLE_SSL_CERTPROBLEM,         /* 58 - 本地凭证有问题 */
CURLE_SSL_CIPHER,              /* 59 - 指定的密码无法使用 */
CURLE_SSL_CACERT,              /* 60 - CA证书(路径)有问题 */
CURLE_BAD_CONTENT_ENCODING,    /* 61 - 无法识别的编码/坏 */
CURLE_LDAP_INVALID_URL,        /* 62 - 无效的LDAP URL  */
CURLE_FILESIZE_EXCEEDED,       /* 63 - 超出最大文件大小 */
CURLE_USE_SSL_FAILED,          /* 64 - 请求FTP SSL级别失败 */
CURLE_SEND_FAIL_REWIND,        /* 65 - 需要重新发送数据
失败 */
CURLE_SSL_ENGINE_INITFAILED,   /* 66 - 初始化 ENGINE 失败 */
CURLE_LOGIN_DENIED,            /* 67 - 用户名,密码或类似的不
接受我们登录失败*/
CURLE_TFTP_NOTFOUND,           /* 68 - 文件未在服务器上找到 */
CURLE_TFTP_PERM,               /* 69 - 服务器上的权限问题 */
CURLE_REMOTE_DISK_FULL,        /* 70 - 服务器上的磁盘空间不足 */
CURLE_TFTP_ILLEGAL,            /* 71 - 非法的TFTP操作 */
CURLE_TFTP_UNKNOWNID,          /* 72 - 未知的传输ID */
CURLE_REMOTE_FILE_EXISTS,      /* 73 - 文件已经存在 */
CURLE_TFTP_NOSUCHUSER,         /* 74 - 没有这样的用户*/
CURLE_CONV_FAILED,             /* 75 - 转换失败 */
CURLE_CONV_REQD,               /* 76 - 调用者必须注册转换
使用curl_easy_setopt回调选项
CURLOPT_CONV_FROM_NETWORK_FUNCTION,
CURLOPT_CONV_TO_NETWORK_FUNCTION, and
CURLOPT_CONV_FROM_UTF8_FUNCTION */
CURLE_SSL_CACERT_BADFILE,      /* 77 - 无法加载CACERT文件,缺少
或格式错误 */
CURLE_REMOTE_FILE_NOT_FOUND,   /* 78 - 远程文件没有找到 */
CURLE_SSH,                     /* 79 - SSH layer 的错误, 有点常用
所以当错误发生时错误会显示出来
*/

CURLE_SSL_SHUTDOWN_FAILED,     /* 80 - 无法关闭SSL连接 */
CURLE_AGAIN,                   /* 81 - socket 还没有准备好发送/接收,
等到它已经准备好,然后再试一次*/
CURLE_SSL_CRL_BADFILE,         /* 82 - 无法加载CRL文件,丢失或
格式错误(在7.19.0版加入) */
CURLE_SSL_ISSUER_ERROR,        /* 83 - 发行人检查失败。(由
7.19.0版) */
CURLE_FTP_PRET_FAILED,         /* 84 - 一个PRET命令的失败 */
CURLE_RTSP_CSEQ_ERROR,         /* 85 - RTSP的Cseq号码不匹配 */
CURLE_RTSP_SESSION_ERROR,      /* 86 - RTSP会话ID不匹配 */
CURLE_FTP_BAD_FILE_LIST,       /* 87 - 无法解析FTP文件列表 */
CURLE_CHUNK_FAILED,            /* 88 - 块回调报告错误 */
CURL_LAST /* never use! */
} CURLcode;

#ifndef CURL_NO_OLDIES /* 定义这个测试,如果你的应用程序建立的所有过时的东西都会被删掉! */

/* 重新使用以前废弃的错误代码7.24.0 */
#define CURLE_OBSOLETE10 CURLE_FTP_ACCEPT_FAILED
#define CURLE_OBSOLETE12 CURLE_FTP_ACCEPT_TIMEOUT

/*  兼容性与旧版本的名称 */
#define CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING

/* 以下,2011年4月加入7.21.5 */
#define CURLE_UNKNOWN_TELNET_OPTION CURLE_UNKNOWN_OPTION

/* 以下分别加入7.17.1 */
/* 这些定于2009年消失*/
#define CURLE_SSL_PEER_CERTIFICATE CURLE_PEER_FAILED_VERIFICATION

/* 以下分别加入7.17.1 */
/* 这些定于2009年消失*/
#define CURLE_OBSOLETE CURLE_OBSOLETE50 /* 任何人都不应该用这个! */
#define CURLE_BAD_PASSWORD_ENTERED CURLE_OBSOLETE46
#define CURLE_BAD_CALLING_ORDER CURLE_OBSOLETE44
#define CURLE_FTP_USER_PASSWORD_INCORRECT CURLE_OBSOLETE10
#define CURLE_FTP_CANT_RECONNECT CURLE_OBSOLETE16
#define CURLE_FTP_COULDNT_GET_SIZE CURLE_OBSOLETE32
#define CURLE_FTP_COULDNT_SET_ASCII CURLE_OBSOLETE29
#define CURLE_FTP_WEIRD_USER_REPLY CURLE_OBSOLETE12
#define CURLE_FTP_WRITE_ERROR CURLE_OBSOLETE20
#define CURLE_LIBRARY_NOT_FOUND CURLE_OBSOLETE40
#define CURLE_MALFORMAT_USER CURLE_OBSOLETE24
#define CURLE_SHARE_IN_USE CURLE_OBSOLETE57
#define CURLE_URL_MALFORMAT_USER CURLE_NOT_BUILT_IN

#define CURLE_FTP_ACCESS_DENIED CURLE_REMOTE_ACCESS_DENIED
#define CURLE_FTP_COULDNT_SET_BINARY CURLE_FTP_COULDNT_SET_TYPE
#define CURLE_FTP_QUOTE_ERROR CURLE_QUOTE_ERROR
#define CURLE_TFTP_DISKFULL CURLE_REMOTE_DISK_FULL
#define CURLE_TFTP_EXISTS CURLE_REMOTE_FILE_EXISTS
#define CURLE_HTTP_RANGE_ERROR CURLE_RANGE_ERROR
#define CURLE_FTP_SSL_FAILED CURLE_USE_SSL_FAILED

/* 以下早就添加了 */

#define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT

#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR
#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED
#define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED

#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE
#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME

/* 这是错误代码50 7.7.3和一些早期版本,这
些 libcurl 不再使用,这里定义只是不是应用程序崩溃的替代 */
#define CURLE_ALREADY_COMPLETE 99999

#endif /*!CURL_NO_OLDIES*/

/* 这个原型适用于所有的转换回调 */
typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length);

typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl,    /* easy 手柄 */
void *ssl_ctx, /* 实际上是一个
OpenSSL SSL_CTX */
void *userptr);

typedef enum {
CURLPROXY_HTTP = 0,   /*7.10增加,新的7.19.4默认是使用
CONNECT HTTP/1.1 */
CURLPROXY_HTTP_1_0 = 1,   /* 7.19.4增加,强制使用CONNECT
HTTP/1.0  */
CURLPROXY_SOCKS4 = 4, /* 7.15.2增加支持,枚举在 7.10 已经存在
*/
CURLPROXY_SOCKS5 = 5, /* added in 7.10 */
CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */
CURLPROXY_SOCKS5_HOSTNAME = 7 /* 使用SOCKS5协议,但传递的时
主机名而非IP地址。added
in 7.18.0 */
} curl_proxytype;  /* 该枚举 added in 7.10 */

/*
*  CURLOPT_HTTPAUTH 、 CURLOPT_PROXYAUTH Bitmasks(位掩码)选项:
*
* CURLAUTH_NONE         - 没有HTTP认证
* CURLAUTH_BASIC        - HTTP基本身份验证(默认)
* CURLAUTH_DIGEST       - HTTP Digest认证
* CURLAUTH_GSSNEGOTIATE - HTTP GSS-协商认证
* CURLAUTH_NTLM         - HTTP NTLM身份验证
* CURLAUTH_DIGEST_IE    - HTTP摘要身份验证使用IE风味
* CURLAUTH_NTLM_WB      - HTTP winbind的助手委派 (NTLM身份验证)
* CURLAUTH_ONLY         - 一起使用和一个单一的其他的强制不认证类型或只是单一类型
* CURLAUTH_ANY          - 所有精细类型
* CURLAUTH_ANYSAFE      - 所有精细除了基本类型
*/

#define CURLAUTH_NONE         ((unsigned long)0)
#define CURLAUTH_BASIC        (((unsigned long)1)<<0)
#define CURLAUTH_DIGEST       (((unsigned long)1)<<1)
#define CURLAUTH_GSSNEGOTIATE (((unsigned long)1)<<2)
#define CURLAUTH_NTLM         (((unsigned long)1)<<3)
#define CURLAUTH_DIGEST_IE    (((unsigned long)1)<<4)
#define CURLAUTH_NTLM_WB      (((unsigned long)1)<<5)
#define CURLAUTH_ONLY         (((unsigned long)1)<<31)
#define CURLAUTH_ANY          (~CURLAUTH_DIGEST_IE)
#define CURLAUTH_ANYSAFE      (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE))

#define CURLSSH_AUTH_ANY       ~0     /* 服务器所支持的所有类型 */
#define CURLSSH_AUTH_NONE      0      /* 没有允许的,愚蠢的,但完整的 */
#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* (public/private )公钥/私钥文件 */
#define CURLSSH_AUTH_PASSWORD  (1<<1) /* 密码 */
#define CURLSSH_AUTH_HOST      (1<<2) /* 主机密钥文件 */
#define CURLSSH_AUTH_KEYBOARD  (1<<3) /* 键盘互动 */
#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY

#define CURLGSSAPI_DELEGATION_NONE        0      /* 没有代理(默认) */
#define CURLGSSAPI_DELEGATION_POLICY_FLAG (1<<0) /* 如果政策允许 */
#define CURLGSSAPI_DELEGATION_FLAG        (1<<1) /* 总是委托 */

#define CURL_ERROR_SIZE 256

struct curl_khkey {
const char *key; /* 指向以零结尾的字符串,以base64编码
如果len为0, otherwise 指向 "raw"(原始) 数据 */
size_t len;
enum type {
CURLKHTYPE_UNKNOWN,
CURLKHTYPE_RSA1,
CURLKHTYPE_RSA,
CURLKHTYPE_DSS
} keytype;
};

/* 这是一套 从 curl_sshkeycallback callback的返回值预期 */
enum curl_khstat {
CURLKHSTAT_FINE_ADD_TO_FILE,
CURLKHSTAT_FINE,
CURLKHSTAT_REJECT, /* 拒绝连接,返回一个错误 */
CURLKHSTAT_DEFER,  /* 不接受,也不正确回答d
这会导致一个CURLE_DEFER错误,但在其他方面
连接将被完整保留等 */
CURLKHSTAT_LAST    /* 不使用,只有在名单最后标记 */
};

/* 这是一套传递给回调的状态代码 */
enum curl_khmatch {
CURLKHMATCH_OK,       /* 匹配 */
CURLKHMATCH_MISMATCH, /* 主机发现,关键字不匹配! */
CURLKHMATCH_MISSING,  /* 找不到匹配的 host/key  */
CURLKHMATCH_LAST      /* 不使用,只有在名单最后标记 */
};

typedef int
(*curl_sshkeycallback) (CURL *easy,     /* easy handle */
const struct curl_khkey *knownkey, /* 已知 */
const struct curl_khkey *foundkey, /* 发现 */
enum curl_khmatch, /* libcurl's 视图上的按键 */
void *clientp); /* 应用程序通过的自定义指针 */

/*  CURLOPT_USE_SSL 参数选项 */
typedef enum {
CURLUSESSL_NONE,    /* 不要尝试使用SSL*/
CURLUSESSL_TRY,     /* 尝试使用SSL, 无论如何以其他方式继续进行 */
CURLUSESSL_CONTROL, /* 用于控制SSL连接或失败 */
CURLUSESSL_ALL,     /* 所有 SSL 通信或失败 */
CURLUSESSL_LAST     /* 不是一种选择,从来没有使用 */
} curl_usessl;

/* 为 CURLOPT_SSL_OPTIONS 定义 bits 参数: */

/* - ALLOW_BEAST告知libcurl允许BEAST SSL中的漏洞
提高与旧的服务器名称的互操作性。一些SSL库
应对这些缺陷的变通办法,但是有些变通使 SSL通信失败
要使用旧服务器的这些功能,用户可以通过这种方式允许漏洞
*/
#define CURLSSLOPT_ALLOW_BEAST (1<<0)

#ifndef CURL_NO_OLDIES /* 定义这个测试,如果你的应用程序建立的所有过时的东西都会被删掉! */

/* 向后兼容旧名 */
/* 这是定于2009年消失 */

#define CURLFTPSSL_NONE CURLUSESSL_NONE
#define CURLFTPSSL_TRY CURLUSESSL_TRY
#define CURLFTPSSL_CONTROL CURLUSESSL_CONTROL
#define CURLFTPSSL_ALL CURLUSESSL_ALL
#define CURLFTPSSL_LAST CURLUSESSL_LAST
#define curl_ftpssl curl_usessl
#endif /*!CURL_NO_OLDIES*/

/* CURLOPT_FTP_SSL_CCC 参数选项 */
typedef enum {
CURLFTPSSL_CCC_NONE,    /* 不发送 CCC */
CURLFTPSSL_CCC_PASSIVE, /* 让服务器开始关机 */
CURLFTPSSL_CCC_ACTIVE,  /* 开始关机(主动) */
CURLFTPSSL_CCC_LAST     /* 不是一种选择,从来没有使用 */
} curl_ftpccc;

/*  CURLOPT_FTPSSLAUTH 参数选项 */
typedef enum {
CURLFTPAUTH_DEFAULT, /* 让libcurl的决定 */
CURLFTPAUTH_SSL,     /* use "AUTH SSL" */
CURLFTPAUTH_TLS,     /* use "AUTH TLS" */
CURLFTPAUTH_LAST /* 不是一种选择,从来没有使用 */
} curl_ftpauth;

/*  CURLOPT_FTP_CREATE_MISSING_DIRS 参数选项 */
typedef enum {
CURLFTP_CREATE_DIR_NONE,  /* 不创建丢失的 dirs! */
CURLFTP_CREATE_DIR,       /* (FTP/SFTP) 如果 CWD 失败, 尝试 MKD然后再次尝试 CWD
如果这次 MKD 成功,  SFTP 失败时也这样做
*/
CURLFTP_CREATE_DIR_RETRY, /* (FTP only) 如果 CWD 失败, 尝试 MKD然后再次尝试 CWD
如果这次 MKD 失败! */
CURLFTP_CREATE_DIR_LAST   /* 不是一种选择,从来没有使用 */
} curl_ftpcreatedir;

/*  CURLOPT_FTP_FILEMETHOD 参数选项 */
typedef enum {
CURLFTPMETHOD_DEFAULT,   /* 让 libcurl 选择 */
CURLFTPMETHOD_MULTICWD,  /* 每个部分的路径都是单一的 CWD 操作*/
CURLFTPMETHOD_NOCWD,     /* 都没下有一个 CWD ,然后在那上面工作  */
CURLFTPMETHOD_SINGLECWD, /* 目录没有 CMD 文件 */
CURLFTPMETHOD_LAST       /* 不是一种选择,从来没有使用 */
} curl_ftpmethod;

/* CURLPROTO_ 为 CURLOPT_*PROTOCOLS 定义的选项 */
#define CURLPROTO_HTTP   (1<<0)
#define CURLPROTO_HTTPS  (1<<1)
#define CURLPROTO_FTP    (1<<2)
#define CURLPROTO_FTPS   (1<<3)
#define CURLPROTO_SCP    (1<<4)
#define CURLPROTO_SFTP   (1<<5)
#define CURLPROTO_TELNET (1<<6)
#define CURLPROTO_LDAP   (1<<7)
#define CURLPROTO_LDAPS  (1<<8)
#define CURLPROTO_DICT   (1<<9)
#define CURLPROTO_FILE   (1<<10)
#define CURLPROTO_TFTP   (1<<11)
#define CURLPROTO_IMAP   (1<<12)
#define CURLPROTO_IMAPS  (1<<13)
#define CURLPROTO_POP3   (1<<14)
#define CURLPROTO_POP3S  (1<<15)
#define CURLPROTO_SMTP   (1<<16)
#define CURLPROTO_SMTPS  (1<<17)
#define CURLPROTO_RTSP   (1<<18)
#define CURLPROTO_RTMP   (1<<19)
#define CURLPROTO_RTMPT  (1<<20)
#define CURLPROTO_RTMPE  (1<<21)
#define CURLPROTO_RTMPTE (1<<22)
#define CURLPROTO_RTMPS  (1<<23)
#define CURLPROTO_RTMPTS (1<<24)
#define CURLPROTO_GOPHER (1<<25)
#define CURLPROTO_ALL    (~0) /* 一切都启用*/

/* 长可能是32或64位,但我们决不应该依靠其他任何但是一定要有32位 */
#define CURLOPTTYPE_LONG          0
#define CURLOPTTYPE_OBJECTPOINT   10000
#define CURLOPTTYPE_FUNCTIONPOINT 20000
#define CURLOPTTYPE_OFF_T         30000

/* 名字是大写的 CURLOPT_<name>,
type 是 CURLOPTTYPE_<type> 里面定义的一种
号码是唯一的标识符 */
#ifdef CINIT
#undef CINIT
#endif

#ifdef CURL_ISOCPP
#define CINIT(na,t,nu) CURLOPT_ ## na = CURLOPTTYPE_ ## t + nu
#else
/* 宏 "##"  在 ISO C 中定义, 我们假设 pre-ISO C 不支持他. */
#define LONG          CURLOPTTYPE_LONG
#define OBJECTPOINT   CURLOPTTYPE_OBJECTPOINT
#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT
#define OFF_T         CURLOPTTYPE_OFF_T
#define CINIT(name,type,number) CURLOPT_/**/name = type + number
#endif

/*
* 这个 macro-mania 设置以下的 CURLOPT_[what] 枚举,
*在 curl_easy_setopt() 里面使用.  CINIT() 宏的第一个参数是 [what]
* 单词.
*/

typedef enum {
/* 这是 FILE * or void * 正常输出应该被写入. */
CINIT(FILE, OBJECTPOINT, 1),

/* 完整的URL get/put */
CINIT(URL,  OBJECTPOINT, 2),

/* 连接的端口号, 其它的端口号比默认的好. */
CINIT(PORT, LONG, 3),

/* 使用的代理名称. */
CINIT(PROXY, OBJECTPOINT, 4),

/* "name:password" 使用他获取数据. */
CINIT(USERPWD, OBJECTPOINT, 5),

/* 代理使用的 "name:password" . */
CINIT(PROXYUSERPWD, OBJECTPOINT, 6),

/* 得到的范围,指定为一个ASCII字符串. */
CINIT(RANGE, OBJECTPOINT, 7),

/* not used */

/* 指定的文件上传流(用作输入): */
CINIT(INFILE, OBJECTPOINT, 9),

/* 缓冲区中收到错误消息,必须至少 CURL_ERROR_SIZE 的 byte大小
*如果现在不使用,错误信息使用stderr 代替: */
CINIT(ERRORBUFFER, OBJECTPOINT, 10),

/* 这个函数将被用来存储输出 (而不是fwrite的).
* 该参数将使用 fwrite() 语法,请一定要按照他们. */
CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11),

/* 函数将被调用来读取输入(而不是 fread). The
*  该参数将使用 fread() 语法,请一定要按照他们. */
CINIT(READFUNCTION, FUNCTIONPOINT, 12),

/* 如果读取操作超过了这个时间就是读去超时*/
CINIT(TIMEOUT, LONG, 13),

/* 如果使用CURLOPT_INFILE,这可以用来通知libcurl的
*正在发送的文件真是大小. 这允许更好的错误
*检查和更好的验证,上传成功。-1表示
*大小未知。
*
* 对于大文件支持,也有一个_LARGE的版本
* 关键这需要是 off_t 的长度,允许平台使用超过 off_t 的长度来处理更大的文件
* 见下文 INFILESIZE_LARGE.
*/
CINIT(INFILESIZE, LONG, 14),

/* POST静态输入字段. */
CINIT(POSTFIELDS, OBJECTPOINT, 15),

/* 设置一些CGI程序需要的引用页*/
CINIT(REFERER, OBJECTPOINT, 16),

/*设置的的FTP PORT字符串 (接口名称、IP地址)
使用 i.e 时'-' 使用的默认地址. */
CINIT(FTPPORT, OBJECTPOINT, 17),

/* 设置User-Agent字符串(一些CGI程序检查) */
CINIT(USERAGENT, OBJECTPOINT, 18),

/* 如果下载速度低于 "low speed limit" bytes/second
* 在 "low speed time" 秒, 操作会中止.
* 如果你有一个相当高的速度连接,
* 如果中止必须在20秒内,速度小于2000 bytes/second。
*/

/* Set the "low speed limit" */
CINIT(LOW_SPEED_LIMIT, LONG, 19),

/* Set the "low speed time" */
CINIT(LOW_SPEED_TIME, LONG, 20),

/* 设置继续偏移.
*
* Note 这里也有一个_LARGE的版本
* 关键这需要是 off_t 的长度, 允许不是 32 位的平台使用大文件偏移
*  看下面RESUME_FROM_LARGE.
*/
CINIT(RESUME_FROM, LONG, 21),

/* 设置cookie请求: */
CINIT(COOKIE, OBJECTPOINT, 22),

/* 指向一个链表头, struct curl_slist 是其中一种 */
CINIT(HTTPHEADER, OBJECTPOINT, 23),

/* 指向连标条目, struct curl_httppost */
CINIT(HTTPPOST, OBJECTPOINT, 24),

/* 保持你的私有 SSL-certificate(证书)名 */
CINIT(SSLCERT, OBJECTPOINT, 25),

/* SSL或SSH私钥密码*/
CINIT(KEYPASSWD, OBJECTPOINT, 26),

/* 发送参数类型? */
CINIT(CRLF, LONG, 27),

/* 发送链表的 QUOTE(索引) 命令 */
CINIT(QUOTE, OBJECTPOINT, 28),

/* 发送 FILE * or void * 存储标题,如果你使用一个回调
简单的传递未修改的回调*/
CINIT(WRITEHEADER, OBJECTPOINT, 29),

/* 指向到一个文件中读取初始的cookie
也可以启用"cookie awareness" */
CINIT(COOKIEFILE, OBJECTPOINT, 31),

/* 什么版本专门原来尝试
看看下面 CURL_SSLVERSION 的定义. */
CINIT(SSLVERSION, LONG, 32),

/* 使用什么样的HTTP时间条件,请参阅定义 */
CINIT(TIMECONDITION, LONG, 33),

/* 使用上述条件的时间。指定秒数
从1970年1月1日 开始*/
CINIT(TIMEVALUE, LONG, 34),

/* 35 = OBSOLETE */// 作废

/* 自定义的请求,定制get命令,如
HTTP: DELETE, TRACE(跟踪) and others
FTP: 使用不同的list命令
*/
CINIT(CUSTOMREQUEST, OBJECTPOINT, 36),

/* HTTP请求,删除,跟踪和其他奇怪的命令 */
CINIT(STDERR, OBJECTPOINT, 37),

/* 38 is not used */

/* 发送 post-transfer 的 linked-list 查询命令 */
CINIT(POSTQUOTE, OBJECTPOINT, 39),

CINIT(WRITEINFO, OBJECTPOINT, 40), /* 不推荐使用,不使用! */

CINIT(VERBOSE, LONG, 41),      /* 谈了很多 */
CINIT(HEADER, LONG, 42),       /* 扔头的太多 */
CINIT(NOPROGRESS, LONG, 43),   /* 关闭进度表 */
CINIT(NOBODY, LONG, 44),       /* 使用HTTP头文件 */
CINIT(FAILONERROR, LONG, 45),  /* 无输出HTTP错误 codes >= 300 */
CINIT(UPLOAD, LONG, 46),       /* 这是一个上传 */
CINIT(POST, LONG, 47),         /* HTTP POST 方法 */
CINIT(DIRLISTONLY, LONG, 48),  /* 只显示列表目录的名字 */

CINIT(APPEND, LONG, 50),       /* 追加而不是覆盖上载! */

/* 指定是否使用 user+password 读取 .netrc or the URL.
* 这必须是下面的CURL_NETRC_ *枚举之一. */
CINIT(NETRC, LONG, 51),

CINIT(FOLLOWLOCATION, LONG, 52),  /* 使用地点: Luke! */

CINIT(TRANSFERTEXT, LONG, 53), /* 传输数据 text/ASCII 格式 */
CINIT(PUT, LONG, 54),          /* HTTP PUT */

/* 55 = OBSOLETE */// 作废

/* 调用函数,替代内部的进度显示功能
* 此功能应该被定义为 curl_progress_callback 定义的原型
*/
CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56),

/* 数据传递给进度回调* */
CINIT(PROGRESSDATA, OBJECTPOINT, 57),

/* 我们希望引用字段时自动设置以下位置 */
CINIT(AUTOREFERER, LONG, 58),

/*端口的代理,可以设置代理字符串:
"[host]:[port]" */
CINIT(PROXYPORT, LONG, 59),

/* POST输入数据的大小, 如果 strlen() 函数不是很好用可以使用这个函数 */
CINIT(POSTFIELDSIZE, LONG, 60),

/* 通过 HTTP 代理操作 non-http通道*/
CINIT(HTTPPROXYTUNNEL, LONG, 61),

/* 设置接口字符串用作 outgoing 网络接口 */
CINIT(INTERFACE, OBJECTPOINT, 62),

/* 设置 krb4/5 安全水平, 这也启用了 krb4/5 awareness(意识).
* 这是一个 'clear', 'safe', 'confidential' or 'private' 字符串.
* 如果字符串设置了且没有匹配这些字符串, 那么将使用 'private'.  */
CINIT(KRBLEVEL, OBJECTPOINT, 63),

/* 设置在 SSL 握手时是否验证对方,1代表验证 */
CINIT(SSL_VERIFYPEER, LONG, 64),

/* 当 SSL_VERIFYPEER  是 true时,  CApath or CAfile 用来验证同级证书*/
CINIT(CAINFO, OBJECTPOINT, 65),

/* 66 = OBSOLETE */// 作废
/* 67 = OBSOLETE */// 作废

/* HTTP重定向的最大数量 */
CINIT(MAXREDIRS, LONG, 68),

/* 通过长设置为1以获取所请求的文档的日期(如果
可能的话)!通过一个零,把它关掉. */
CINIT(FILETIME, LONG, 69),

/* 指向一个链表的telnet选项 */
CINIT(TELNETOPTIONS, OBJECTPOINT, 70),

/*最大数量的 alive 的缓存链接 */
CINIT(MAXCONNECTS, LONG, 71),

CINIT(CLOSEPOLICY, LONG, 72), /* 不推荐使用,不使用! */

/* 73 = OBSOLETE */// 作废

/* 使用一个新的链接设置为即将到来的传递
不要使用这个,除非你知道这一点,因为它使
操作速度较慢,不太友好的网络。 */
CINIT(FRESH_CONNECT, LONG, 74),

/* 使用 re-used 禁止即将传递过来的连接
不要使用这个,除非你知道这一点,因为它使
操作速度较慢,不太友好的网络。  */
CINIT(FORBID_REUSE, LONG, 75),

/* 为libcurl的使用随机引擎,做SSL连接 设置一个包含随机数据的文件名. */
CINIT(RANDOM_FILE, OBJECTPOINT, 76),

/* Set Entropy Gathering Daemon socket 路径名 */
CINIT(EGDSOCKET, OBJECTPOINT, 77),

/* Time-out 这几秒后, 如果有链接操作这段时间都 OK,然后进入连接中断操作阶段. [只在 unix-style/SIGALRM 上有效] */
CINIT(CONNECTTIMEOUT, LONG, 78),

/* *函数将被调用用于存储头文件(代替fwrite)
*  该参数将使用 fwrite() 语法,请一定要按照他们. */
CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79),

/* 强制设置HTTP请求时使用 GET. 只在post 可用时, PUT or 最早自定义请求.
*/
CINIT(HTTPGET, LONG, 80),

/* 设置 SSL 对等证书握手时我们是否验证通用用户名, set 1 检查是否存在, 2 确保他和提供的主机名匹配. */
CINIT(SSL_VERIFYHOST, LONG, 81),

/*在指定文件名写在完成后的所有已知的 cookies
操作.*/
CINIT(COOKIEJAR, OBJECTPOINT, 82),

/* 指定使用SSL密码 */
CINIT(SSL_CIPHER_LIST, OBJECTPOINT, 83),

/* 指定使用的HTTP版本! 必须设置为
CURL_HTTP_VERSION* 的枚举类型之一. */
CINIT(HTTP_VERSION, LONG, 84),

/* 开启或关闭的FTP引擎的使用EPSV命令.
. */
CINIT(FTP_USE_EPSV, LONG, 85),

/* 保持你的SSL证书的文件类型 ("DER", "PEM", "ENG") */
CINIT(SSLCERTTYPE, OBJECTPOINT, 86),

/* 保持你私人的SSL密钥的类型文件名 */
CINIT(SSLKEY, OBJECTPOINT, 87),

/* 保持你私人的SSL密钥的类型文件 ("DER", "PEM", "ENG") */
CINIT(SSLKEYTYPE, OBJECTPOINT, 88),

/* 加密引擎的SSL子系统 */
CINIT(SSLENGINE, OBJECTPOINT, 89),

/* 设置加密引擎作为默认的SSL子系统
参数已经没有任何意义
*/
CINIT(SSLENGINE_DEFAULT, LONG, 90),

/* 非零值表示使用全局DNS缓存 */
CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91), /* 不推荐使用,不使用! */

/* DNS缓存超时 */
CINIT(DNS_CACHE_TIMEOUT, LONG, 92),

/* 链表转移前发送查询命令 */
CINIT(PREQUOTE, OBJECTPOINT, 93),

/* 设置调试功能 */
CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94),

/* 设置数据调试功能 */
CINIT(DEBUGDATA, OBJECTPOINT, 95),

/* 标记一个cookie会话开始 */
CINIT(COOKIESESSION, LONG, 96),

/* 如果SSL_VERIFYPEER 是 true 使用此选项用来验证CApath目录同级证书 */
CINIT(CAPATH, OBJECTPOINT, 97),

/* 提示 libcurl的使用较小的接收缓冲区 */
CINIT(BUFFERSIZE, LONG, 98),

/* 指示libcurl的不使用任何信号/报警处理,即使使用
超时.此选项是有用的多线程应用程序.
See libcurl-the-guide 更多的背景信息. */
CINIT(NOSIGNAL, LONG, 99),

/* 提供CURLShare的非-TS数据mutexing */
CINIT(SHARE, OBJECTPOINT, 100),

/* 表示代理类型。可接受的值是CURLPROXY_HTTP(默认),
CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and CURLPROXY_SOCKS5. */
CINIT(PROXYTYPE, LONG, 101),

/* 设置的接受编码字符串。使用这告诉服务器你想
响应被压缩。7.21.6之前,这被称为
CURLOPT_ENCODING */
CINIT(ACCEPT_ENCODING, OBJECTPOINT, 102),

/* 设置私有数据的指针 */
CINIT(PRIVATE, OBJECTPOINT, 103),

/* 设置别名为​​HTTP 200 HTTP响应头 */
CINIT(HTTP200ALIASES, OBJECTPOINT, 104),

/*继续发送认证(用户名+密码)以下位置时,
即使更改主机名,这可能会发送名字和密码到服务器决定的主机  */
CINIT(UNRESTRICTED_AUTH, LONG, 105),

/* 具体开启或关闭的FTP引擎,使用的EPRT命令(
它也禁用LPRT的的尝试)。默认情况下,将永远
尝试传统的PORT命令. */
CINIT(FTP_USE_EPRT, LONG, 106),

/*  设置位掩码值启用特定的认证方法
结合 CURLOPT_PROXYUSERPWD 一起使用.
Note 设置多个,可能会导致额外的网络往返。 */
CINIT(HTTPAUTH, LONG, 107),

/* 设置SSL上下文的回调函数,目前只针对OpenSSL的SSL_CTX的 第二个参数.
该功能必须匹配 curl_ssl_ctx_callback 源. */
CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108),

/* SSL上下文回调函数的第三个用户数据 参数*/
CINIT(SSL_CTX_DATA, OBJECTPOINT, 109),

/* 可以导致忘记在远程 FTP 服务器上创建目录
In 7.19.4 我们介绍了便利枚举使用此选项的  CURLFTP_CREATE_DIR 前缀.
*/
CINIT(FTP_CREATE_MISSING_DIRS, LONG, 110),

/* 设置位掩码值启用特定的认证方法
结合 CURLOPT_PROXYUSERPWD 一起使用.
Note 设置多个,可能会导致额外的网络往返。. */
CINIT(PROXYAUTH, LONG, 111),

/* 改变 FTP超时时间(秒), 这是不同的转让超时时间
本质上在 FTP 服务器上放置一个及时的需求确认命令。 */
CINIT(FTP_RESPONSE_TIMEOUT, LONG, 112),
#define CURLOPT_SERVER_RESPONSE_TIMEOUT CURLOPT_FTP_RESPONSE_TIMEOUT

/* 设置 CURL_IPRESOLVE_* 的选项之一,定义见下文
告诉libcurl只解析这些IP版本. 这只在支持 IPv4 _and_ IPv6 的系统上有效. */
CINIT(IPRESOLVE, LONG, 113),

/* 设置这个选项来限制你从 http/FTP 服务器上 下载的文件大小.

注意也有_LARGE版本,增加了大文件的支持
off_t的长度尺寸有较大的平台.  See MAXFILESIZE_LARGE below. */
CINIT(MAXFILESIZE, LONG, 114),

/* 看上面的 INFILESIZE 注释, 在短期制定正在上传文件的大小,  -1 意味着未知.
*/
CINIT(INFILESIZE_LARGE, OFF_T, 115),

/* 设置继续偏移. 这个还有一个较长的版本;
* 看上面的 RESUME_FROM.
*/
CINIT(RESUME_FROM_LARGE, OFF_T, 116),

/* 设置你希望从 http/FTP 服务器上 下载的,最大数据大小  See MAXFILESIZE 以上的版本.
*/
CINIT(MAXFILESIZE_LARGE, OFF_T, 117),

/* 设置你希望用 libcurl来解析的 .netrc 文件的名字(使用 CURLOPT_NETRC 选项).如果你没有设置, libcurl 会做一个很差的尝试 找到用户的主目录和检查 .netrc 文件在那里 */
CINIT(NETRC_FILE, OBJECTPOINT, 118),

/* 为 FTP 启用 SSL/TLS , 挑选一个:
CURLFTPSSL_TRY     -  尝试使用SSL,否则使用任何方式继续
CURLFTPSSL_CONTROL - SSL 用于控制连接或失败
CURLFTPSSL_ALL     - SSL的所有通信或失败
*/
CINIT(USE_SSL, LONG, 119),

/*  标准 POSTFIELDSIZE 版本的 _LARGE 选项 */
CINIT(POSTFIELDSIZE_LARGE, OFF_T, 120),

/* 启用/禁用TCP Nagle算法 */
CINIT(TCP_NODELAY, LONG, 121),

/* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */// 作废
/* 123 OBSOLETE. Gone in 7.16.0 */// 作废
/* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */// 作废
/* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */// 作废
/* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */// 作废
/* 127 OBSOLETE. Gone in 7.16.0 */// 作废
/* 128 OBSOLETE. Gone in 7.16.0 */// 作废

/* 通过SSL/ TLS的FTP被选中 (with CURLOPT_USE_SSL), 这个选项
可以用来改变libcurl 默认情况下首先尝试
"AUTH SSL" 然后尝试 "AUTH TLS" , 当返回一个 OK 时代表相应已经收到

可用的参数是:
CURLFTPAUTH_DEFAULT - 让libcurl的决定
CURLFTPAUTH_SSL     - try "AUTH SSL" first, then TLS
CURLFTPAUTH_TLS     - try "AUTH TLS" first, then SSL
*/
CINIT(FTPSSLAUTH, LONG, 129),

CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130),
CINIT(IOCTLDATA, OBJECTPOINT, 131),

/* 132 OBSOLETE. Gone in 7.16.0 */// 作废
/* 133 OBSOLETE. Gone in 7.16.0 */// 作废

/* 当被问及“帐户”信息时,零终止字符串传递到FTP服务器上 */
CINIT(FTP_ACCOUNT, OBJECTPOINT, 134),

/* 在 cookie engine 里面寻找 cookie*/
CINIT(COOKIELIST, OBJECTPOINT, 135),

/* 忽略 Content-Length */
CINIT(IGNORE_CONTENT_LENGTH, LONG, 136),

/* 设置为非零值跳过在227 PASV FTP服务器接收的IP地址响应。通常用于FTP的SSL,但并不限定于
这一点。 libcurl 将使用相同的IP地址代替,它用于
控制连接*/
CINIT(FTP_SKIP_PASV_IP, LONG, 137),

/* 做 FTP 时用来选择 "file method", see the curl_ftpmethod
above. */
CINIT(FTP_FILEMETHOD, LONG, 138),

/* 将套接字绑定的本地端口号 */
CINIT(LOCALPORT, LONG, 139),

/* 端口的尝试, 包括第一组 LOCALPORT.
将其设置为1,除了第一次外将不作任何额外的尝试.
*/
CINIT(LOCALPORTRANGE, LONG, 140),

/* 没有传递, 使用 CURLINFO_LASTSOCKET 提取,设置让应用程序连接的sock */
CINIT(CONNECT_ONLY, LONG, 141),

/* 函数将被调用从网络编码(而不是使用libcurl中的iconv调用 */
CINIT(CONV_FROM_NETWORK_FUNCTION, FUNCTIONPOINT, 142),

/* 函数将被调用转换为
网络编码(而不是使用libcurl中的iconv调用 */
CINIT(CONV_TO_NETWORK_FUNCTION, FUNCTIONPOINT, 143),

/* 函数将被调用来从UTF8转换
(而不是使用的iconv调用libcurl中)
请注意,这仅用于SSL证书的处理*/
CINIT(CONV_FROM_UTF8_FUNCTION, FUNCTIONPOINT, 144),

/* 如果连接进行得很快那么就需要把速度放慢 */
/* limit-rate: 每秒字节数为单位的最大数量的发送或接收 */
CINIT(MAX_SEND_SPEED_LARGE, OFF_T, 145),
CINIT(MAX_RECV_SPEED_LARGE, OFF_T, 146),

/* 如果用户名/密码发送失败指向命令字符串。 */
CINIT(FTP_ALTERNATIVE_TO_USER, OBJECTPOINT, 147),

/* 回调函数设置套接字选项 */
CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148),
CINIT(SOCKOPTDATA, OBJECTPOINT, 149),

/* 设置为0以禁用会话ID,再利用这种传递 , default is
enabled (== 1) */
CINIT(SSL_SESSIONID_CACHE, LONG, 150),

/* 允许SSH验证方法 */
CINIT(SSH_AUTH_TYPES, LONG, 151),

/* scp/sftp 使用公钥/私钥认证 */
CINIT(SSH_PUBLIC_KEYFILE, OBJECTPOINT, 152),
CINIT(SSH_PRIVATE_KEYFILE, OBJECTPOINT, 153),

/* 认证后发送 CCC (Clear Command Channel)  */          //清理通道命令
CINIT(FTP_SSL_CCC, LONG, 154),

/* 作为 TIMEOUT and CONNECTTIMEOUT, 但是把它们分解为毫秒 */
CINIT(TIMEOUT_MS, LONG, 155),
CINIT(CONNECTTIMEOUT_MS, LONG, 156),

/* 设置为0 时禁用 libcurl's 解析 把原始数据传递到应用程序即使他是 encoded/compressed */
CINIT(HTTP_TRANSFER_DECODING, LONG, 157),
CINIT(HTTP_CONTENT_DECODING, LONG, 158),

/* 远程在服务器上创建 文件/文件夹 的权限,支持他的协议有 SFTP/SCP/FILE */
CINIT(NEW_FILE_PERMS, LONG, 159),
CINIT(NEW_DIRECTORY_PERMS, LONG, 160),

/* 设置POST的重定向时的行为. 必须设置下面 CURL_REDIR* 定义的一个值. 这曾被称为 CURLOPT_POST301 */
CINIT(POSTREDIR, LONG, 161),

/* 使用 scp/sftp 来验证主机的公匙 */
CINIT(SSH_HOST_PUBLIC_KEY_MD5, OBJECTPOINT, 162),

/*回调函数用于打开 socket (代替 socket(2)). 可选,
回调是能够改变地址或拒绝连接返回
CURL_SOCKET_BAD.  回调的类型应该是
curl_opensocket_callback */
CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 163),
CINIT(OPENSOCKETDATA, OBJECTPOINT, 164),

/* POST波动的输入字段。 */
CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165),

/* s设置传输模式 (;type=<a|i>) 做FTP通过HTTP代理 */
CINIT(PROXY_TRANSFER_MODE, LONG, 166),

/* 寻求输入流中的回调函数* */
CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167),
CINIT(SEEKDATA, OBJECTPOINT, 168),

/* CRL file */
CINIT(CRLFILE, OBJECTPOINT, 169),

/* 发行证书 */
CINIT(ISSUERCERT, OBJECTPOINT, 170),

/* (IPv6) 的地址范围 */
CINIT(ADDRESS_SCOPE, LONG, 171),

/* 收藏证书链信息后,并允许它使用 CURLINFO_CERTINFO 检索跳转. 可惜只在使用 OpenSSL-powered builds时有效. */
CINIT(CERTINFO, LONG, 172),

/* 使用时取的 "name" and "pwd" . */
CINIT(USERNAME, OBJECTPOINT, 173),
CINIT(PASSWORD, OBJECTPOINT, 174),

/* 使用代理时取的 "name" and "pwd" . */
CINIT(PROXYUSERNAME, OBJECTPOINT, 175),
CINIT(PROXYPASSWORD, OBJECTPOINT, 176),

/* 逗号分割的定义无代理区的主机名列表。这些都应该和在域名内的两个主机名匹配 local.com 将匹配到 local.com and www.local.com, 但不能匹配到 notlocal.com or www.notlocal.com. 这一点是为了与其他实现兼容, .local.com 将被认为和 local.com 相同. 一个单一的*是唯一有效的通配符,禁止使用代理也是有效的. */
CINIT(NOPROXY, OBJECTPOINT, 177),

/* TFTP传输块大小 */
CINIT(TFTP_BLKSIZE, LONG, 178),

/* Socks Service */
CINIT(SOCKS5_GSSAPI_SERVICE, OBJECTPOINT, 179),

/* Socks Service */
CINIT(SOCKS5_GSSAPI_NEC, LONG, 180),

/* 协议被允许用于设置位掩码转移,从而帮助应用程序,使用者获取 urls 或其它限制外部输入的协议来处理
urls . Defaults to CURLPROTO_ALL. */
CINIT(PROTOCOLS, LONG, 181),

/* 设置libcurl的协议,被允许跟随的 bitmask(位掩码)
作为 CURLOPT_PROTOCOLS 的一个字集. 这意味着协议需要设置两个可以被重定向到的  bitmasks (位掩码). 默认除了 FILE 、 SCP 的所有协议. */
CINIT(REDIR_PROTOCOLS, LONG, 182),

/* 设置 SSH knownhost 使用的文件名 */
CINIT(SSH_KNOWNHOSTS, OBJECTPOINT, 183),

/* 设置SSH主机密钥回调,必须指向一个 curl_sshkeycallback
函数 */
CINIT(SSH_KEYFUNCTION, FUNCTIONPOINT, 184),

/* 设置SSH主机密钥回调的自定义指针 */
CINIT(SSH_KEYDATA, OBJECTPOINT, 185),

/* 设置SMTP邮件发件人 */
CINIT(MAIL_FROM, OBJECTPOINT, 186),

/* 设置SMTP邮件 receiver(s) */
CINIT(MAIL_RCPT, OBJECTPOINT, 187),

/* FTP: 在 PASV 前发送 PRET */
CINIT(FTP_USE_PRET, LONG, 188),

/* RTSP 请求的方法 (OPTIONS, SETUP, PLAY, etc...) */
CINIT(RTSP_REQUEST, LONG, 189),

/*  RTSP session 标识符 */
CINIT(RTSP_SESSION_ID, OBJECTPOINT, 190),

/*  RTSP 的 URI 流 */
CINIT(RTSP_STREAM_URI, OBJECTPOINT, 191),

/* 转换:使用的 RTSP 请求头 */
CINIT(RTSP_TRANSPORT, OBJECTPOINT, 192),

/* 手动初始化 RTSP CSeq 客户端的 handle */
CINIT(RTSP_CLIENT_CSEQ, LONG, 193),

/* 手动初始化 RTSP CSeq 服务器的 handle*/
CINIT(RTSP_SERVER_CSEQ, LONG, 194),

/* 流传递给 INTERLEAVEFUNCTION. */
CINIT(INTERLEAVEDATA, OBJECTPOINT, 195),

/*让应用程序自定义一个RTP数据的写入方法 */
CINIT(INTERLEAVEFUNCTION, FUNCTIONPOINT, 196),

/* 打开通配符匹配 */
CINIT(WILDCARDMATCH, LONG, 197),

/*单个文件(块)开始下载前调用目录匹配回调函数 */
CINIT(CHUNK_BGN_FUNCTION, FUNCTIONPOINT, 198),

/* 文件(块)
下载,或跳过后调用目录匹配回调函数 */
CINIT(CHUNK_END_FUNCTION, FUNCTIONPOINT, 199),

/* 更改通配符匹配 (fnmatch-like) 的回调函数 */
CINIT(FNMATCH_FUNCTION, FUNCTIONPOINT, 200),

/* 让应用程序定义自定义数据快指针 */
CINIT(CHUNK_DATA, OBJECTPOINT, 201),

/* FNMATCH_FUNCTION 用户指针*/
CINIT(FNMATCH_DATA, OBJECTPOINT, 202),

/*  sets 发送链表的 name:port:address */
CINIT(RESOLVE, OBJECTPOINT, 203),

/* 设置TLS身份验证的用户名 */
CINIT(TLSAUTH_USERNAME, OBJECTPOINT, 204),

/* 设置TLS身份验证的密码 */
CINIT(TLSAUTH_PASSWORD, OBJECTPOINT, 205),

/* 设置TLS身份验证的类型 */
CINIT(TLSAUTH_TYPE, OBJECTPOINT, 206),

/* 设为1来启用 "TE:" 在HTTP请求头添加,压缩传输编码的响应. 设为0来禁用 TE:
在传出请求。当前默认为0, 未来的 libcurl 可能会改变.

libcurl 要求压缩的方法, 如果没有, 即使选项被设置为 1 他也不会要求压缩传输i.

*/
CINIT(TRANSFER_ENCODING, LONG, 207),

/* 关闭socket 的回调函数 (代替 close(2)). 这个毁掉应该是 curl_closesocket_callback 类型*/
CINIT(CLOSESOCKETFUNCTION, FUNCTIONPOINT, 208),
CINIT(CLOSESOCKETDATA, OBJECTPOINT, 209),

/*允许GSSAPI证书委托 */
CINIT(GSSAPI_DELEGATION, LONG, 210),

/* 设置域名服务器用于DNS解析 */
CINIT(DNS_SERVERS, OBJECTPOINT, 211),

/* Time-out 多少秒后算做超时操作 (currently for FTP only) . */
CINIT(ACCEPTTIMEOUT_MS, LONG, 212),

/* S设置TCP的 keepalive */
CINIT(TCP_KEEPALIVE, LONG, 213),

/* non-universal 存活旋钮 (Linux, AIX, HP-UX, more) */
CINIT(TCP_KEEPIDLE, LONG, 214),
CINIT(TCP_KEEPINTVL, LONG, 215),

/* Enable/disable 特定的SSL功能的 bitmask(位掩码), see CURLSSLOPT_* */
CINIT(SSL_OPTIONS, LONG, 216),

/* set the SMTP 身份验证的发起者 */
CINIT(MAIL_AUTH, OBJECTPOINT, 217),

CURLOPT_LASTENTRY /* 最后一个未使用 */
} CURLoption;

#ifndef CURL_NO_OLDIES /* 定义这个测试,如果你的应用程序建立的所有过时的东西都会被删掉! */

/* 向后兼容旧名 */
/* 这是定于2011年消失 */

/* 7.19.1版本中加入*/
#define CURLOPT_POST301 CURLOPT_POSTREDIR

/* 这是定于2009年消失 */

/*  7.17.0 版本中加入 */
#define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD
#define CURLOPT_FTPAPPEND CURLOPT_APPEND
#define CURLOPT_FTPLISTONLY CURLOPT_DIRLISTONLY
#define CURLOPT_FTP_SSL CURLOPT_USE_SSL

/* 以下是先前添加的 */

#define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD
#define CURLOPT_KRB4LEVEL CURLOPT_KRBLEVEL

#else
/* 这是用来设置 CURL_NO_OLDIES 在编译时定义*/
#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */// 作废
#endif

/* 下面定义的事 CURLOPT_IPRESOLVE 选项. 如果一台主机
的名称解析地址使用了多个IP协议的版本, 这个选项强制使用特定的 IP 协议版本. */
#define CURL_IPRESOLVE_WHATEVER 0 /* 默认情况下,如果你的系统允许,他会解析所有版本的 ip 地址*/
#define CURL_IPRESOLVE_V4       1 /* 解析 ipv4 地址 */
#define CURL_IPRESOLVE_V6       2 /* 解析 ipv6 地址 */

/* 三个方便的“aliases”,遵循的名称方案更好 */
#define CURLOPT_WRITEDATA CURLOPT_FILE
#define CURLOPT_READDATA  CURLOPT_INFILE
#define CURLOPT_HEADERDATA CURLOPT_WRITEHEADER
#define CURLOPT_RTSPHEADER CURLOPT_HTTPHEADER

/*  CURLOPT_HTTP_VERSION 使用这些枚举选项. */
enum {
CURL_HTTP_VERSION_NONE, /* 这个是什么我们不关心, 我们从 library 里面选择更适合我们的版本 */
CURL_HTTP_VERSION_1_0,  /* 请使用HTTP 1.0的请求 */
CURL_HTTP_VERSION_1_1,  /* 请使用HTTP 1.1请求 */

CURL_HTTP_VERSION_LAST /* *ILLEGAL* HTTP版本 */         //非法的
};

/*
* 公共 RTSP 请求的枚举 API
*/
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 /* 列表中的最后一个 */
};

/* 这些枚举选项在 CURLOPT_NETRC 里面使用. */
enum CURL_NETRC_OPTION {
CURL_NETRC_IGNORED,     /* 默认 .netrc 文件永远不会被读取. */
CURL_NETRC_OPTIONAL,    /* A user: URL里面的密码选项比  .netrc 文件里面的优先考虑. */
CURL_NETRC_REQUIRED,    /* A user:URL中的密码将被忽略.
* 除非在 .netrc 里面查询不到密码选项. */
CURL_NETRC_LAST
};

enum {
CURL_SSLVERSION_DEFAULT,
CURL_SSLVERSION_TLSv1,
CURL_SSLVERSION_SSLv2,
CURL_SSLVERSION_SSLv3,

CURL_SSLVERSION_LAST /* 从来不使用,保持最后 */
};

enum CURL_TLSAUTH {
CURL_TLSAUTH_NONE,
CURL_TLSAUTH_SRP,
CURL_TLSAUTH_LAST /* 从来不使用,保持最后 */
};

/* 符号在 CURLOPT_POSTREDIR.
CURL_REDIR_POST_301, CURL_REDIR_POST_302 and CURL_REDIR_POST_303
里面可以按位或运算例如: CURL_REDIR_POST_301 | CURL_REDIR_POST_302
| CURL_REDIR_POST_303 == CURL_REDIR_POST_ALL */

#define CURL_REDIR_GET_ALL  0
#define CURL_REDIR_POST_301 1
#define CURL_REDIR_POST_302 2
#define CURL_REDIR_POST_303 4
#define 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;

/* 未来版本的 libcurl 可能会删除 curl_strequal() and curl_strnequal() , see lib/README.curlx for details */
CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2);
CURL_EXTERN int (curl_strnequal)(const char *s1, const char *s2, size_t n);

/*  CURLFORM_<name> 里面的 name 要大写*/
#ifdef CFINIT
#undef CFINIT
#endif

#ifdef CURL_ISOCPP
#define CFINIT(name) CURLFORM_ ## name
#else
/* 宏 "##"  在 ISO C 中定义, 我们假设 pre-ISO C 不支持他. */
#define CFINIT(name) CURLFORM_/**/name
#endif

typedef enum {
CFINIT(NOTHING),        /********* 第一个是未使用的 ************/

/*  */
CFINIT(COPYNAME),
CFINIT(PTRNAME),
CFINIT(NAMELENGTH),
CFINIT(COPYCONTENTS),
CFINIT(PTRCONTENTS),
CFINIT(CONTENTSLENGTH),
CFINIT(FILECONTENT),
CFINIT(ARRAY),
CFINIT(OBSOLETE),
CFINIT(FILE),

CFINIT(BUFFER),
CFINIT(BUFFERPTR),
CFINIT(BUFFERLENGTH),

CFINIT(CONTENTTYPE),
CFINIT(CONTENTHEADER),
CFINIT(FILENAME),
CFINIT(END),
CFINIT(OBSOLETE2),

CFINIT(STREAM),

CURLFORM_LASTENTRY /* 最后一个未使用 */
} CURLformoption;

#undef CFINIT /* done */

/*  CURLFORM_ARRAY 的参数结构*/
struct curl_forms {
CURLformoption option;
const char     *value;
};

/* 使用多个 formpost 构建 */
/* Returns  curl_formadd() 的代码
*
* Returns:
* CURL_FORMADD_OK             成功
* CURL_FORMADD_MEMORY         如果分配FormInfo失败
* CURL_FORMADD_OPTION_TWICE   如果其中一个选项两种形式
* CURL_FORMADD_NULL           如果一个空指针被赋给一个char
* CURL_FORMADD_MEMORY         如果一个FormInfo结构分配失败
* CURL_FORMADD_UNKNOWN_OPTION 如果一个未知的选项被使用
* CURL_FORMADD_INCOMPLETE     如果一些FormInfo的是不完整的(或错误)
* CURL_FORMADD_MEMORY         如果curl_httppost结构分配失败
* CURL_FORMADD_MEMORY         如果一些字符串复制分配失败.
* CURL_FORMADD_ILLEGAL_ARRAY  如果在 array 里面使用了一个非法选项
*
***************************************************************************/
typedef enum {
CURL_FORMADD_OK, /* first, no error */

CURL_FORMADD_MEMORY,
CURL_FORMADD_OPTION_TWICE,
CURL_FORMADD_NULL,
CURL_FORMADD_UNKNOWN_OPTION,
CURL_FORMADD_INCOMPLETE,
CURL_FORMADD_ILLEGAL_ARRAY,
CURL_FORMADD_DISABLED, /* 禁用 libcurl 的构建*/

CURL_FORMADD_LAST /* last */
} CURLFORMcode;

/*
* NAME curl_formadd()
*
* DESCRIPTION
*
* 构建多个 formposts 的先进功能. 每次调用添加其中的一部分,然后构建一个完整的 post. 然后使用
* CURLOPT_HTTPPOST 把它们送到 libcurl.
*/
CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost,
struct curl_httppost **last_post,
...);

/*
*  curl_formget() 的回调函数
* 空的 *arg 指针,作为第二个参数传递给 curl_formget() .
* 传递给他的字符串缓冲不能被释放.
*  成功时应该把 buffer length 传递给 "len",然后返回 len
*/
typedef size_t (*curl_formget_callback)(void *arg, const char *buf,
size_t len);

/*
* NAME curl_formget()
*
* DESCRIPTION
*
* 使用 curl_formadd()在构建时序列花一个 curl_httppost结构.
* 第二个参数接受一个空指针传递给 curl_formget_callback 函数.
* Returns 0 on success.
*/
CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg,
curl_formget_callback append);
/*
* NAME curl_formfree()
*
* DESCRIPTION
*
* 释放一个用 curl_formadd() 创建的 formpost.
*/
CURL_EXTERN void curl_formfree(struct curl_httppost *form);

/*
* NAME curl_getenv()
*
* DESCRIPTION
*
* Returns 一个 malloc()'ed 出来的字符串, 他必须在使用完后 curl_free()ed
* DEPRECATED - see lib/README.curlx
*/
CURL_EXTERN char *curl_getenv(const char *variable);

/*
* NAME curl_version()
*
* DESCRIPTION
*
* Returns 描述 libcurl 版本的静态字符串.
*/
CURL_EXTERN char *curl_version(void);

/*
* NAME curl_easy_escape()
*
* DESCRIPTION
*
* Escapes URL strings (
* 转换 %XX URLs 版本里面的非法 字符串). 这个函数返回一个新分配的字符串或NULL如果(发生错误)。
*
*/
CURL_EXTERN char *curl_easy_escape(CURL *handle,
const char *string,
int length);

/* 以前的版本: */
CURL_EXTERN char *curl_escape(const char *string,
int length);

/*
* NAME curl_easy_unescape()
*
* DESCRIPTION
*
* Unescapes URL 编码的字符串 (准缓所有的代码到 %XX 它们的 8bit
* 版本). This 这个函数返回一个新分配的字符串或NULL如果(发生错误)
* Conversion Note: 转换非ASCII平台ASCII%XX代码,转换成主机支持的编码
*
*/
CURL_EXTERN char *curl_easy_unescape(CURL *handle,
const char *string,
int length,
int *outlength);

/* 以前的版本 */
CURL_EXTERN char *curl_unescape(const char *string,
int length);

/*
* NAME curl_free()
*
* DESCRIPTION
*
*提供在同一个转换单元做分配
*  Added in libcurl 7.10
*/
CURL_EXTERN void curl_free(void *p);

/*
* NAME curl_global_init()
*
* DESCRIPTION
*
* 在每个应用程序使用libcurl和其他libcurl的函数之前调用curl_global_init()一次
* 这个功能不是线程安全的!
*/
CURL_EXTERN CURLcode curl_global_init(long flags);

/*
* NAME curl_global_init_mem()
*
* DESCRIPTION
*
* 每个应用程序使用 libcurl 时,都应该调用 curl_global_init() or curl_global_init_mem() 一次. 此功能可被用于
* libcurl的初始化和设置用户定义的内存管理回调
*功能。用户可以实现内存管理例程来检查
*内存泄漏 ,检查误用的 curl 库 etc.  调用用户注册的回调例程,代替系统管理例程.
*/
CURL_EXTERN 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);

/*
* NAME curl_global_cleanup()
*
* DESCRIPTION
*
* 每个应用程序使用 libcurl 时,都应该调用一次curl_global_cleanup()
*/
CURL_EXTERN void curl_global_cleanup(void);

/*  CURLOPT_QUOTE 选项的链表结构 */
struct curl_slist {
char *data;
struct curl_slist *next;
};

/*
* NAME curl_slist_append()
*
* DESCRIPTION
*
* 一个字符串附加到一个链表。如果没有列表的存在,第一次将创建
*. Returns 追加后的新链表.
*/
CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *,
const char *);

/*
* NAME curl_slist_free_all()
*
* DESCRIPTION
*
* 释放先抢创建的 curl_slist.
*/
CURL_EXTERN void curl_slist_free_all(struct curl_slist *);

/*
* NAME curl_getdate()
*
* DESCRIPTION
*
* 返回的时间,第一个参数以秒为1970年以来一月的时间字符串
* 在第二个参数是时间参数未使用应设置为NULL。
*/
CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused);

/* 有关证书链信息,仅用于OpenSSL的构建. 使用 CURLOPT_CERTINFO / CURLINFO_CERTINFO  询问*/
struct curl_certinfo {
int num_of_certs;             /* 证书信息的数量 */
struct curl_slist **certinfo; /* 每个数组中的索引,都有一个
链表中的文本信息(格式为 "name: value" )
*/
};

#define CURLINFO_STRING   0x100000
#define CURLINFO_LONG     0x200000
#define CURLINFO_DOUBLE   0x300000
#define CURLINFO_SLIST    0x400000
#define CURLINFO_MASK     0x0fffff
#define CURLINFO_TYPEMASK 0xf00000

typedef enum {
CURLINFO_NONE, /* 第一,从来不使用这个 */
CURLINFO_EFFECTIVE_URL    = CURLINFO_STRING + 1,
CURLINFO_RESPONSE_CODE    = CURLINFO_LONG   + 2,
CURLINFO_TOTAL_TIME       = CURLINFO_DOUBLE + 3,
CURLINFO_NAMELOOKUP_TIME  = CURLINFO_DOUBLE + 4,
CURLINFO_CONNECT_TIME     = CURLINFO_DOUBLE + 5,
CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6,
CURLINFO_SIZE_UPLOAD      = CURLINFO_DOUBLE + 7,
CURLINFO_SIZE_DOWNLOAD    = CURLINFO_DOUBLE + 8,
CURLINFO_SPEED_DOWNLOAD   = CURLINFO_DOUBLE + 9,
CURLINFO_SPEED_UPLOAD     = CURLINFO_DOUBLE + 10,
CURLINFO_HEADER_SIZE      = CURLINFO_LONG   + 11,
CURLINFO_REQUEST_SIZE     = CURLINFO_LONG   + 12,
CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG   + 13,
CURLINFO_FILETIME         = CURLINFO_LONG   + 14,
CURLINFO_CONTENT_LENGTH_DOWNLOAD   = CURLINFO_DOUBLE + 15,
CURLINFO_CONTENT_LENGTH_UPLOAD     = CURLINFO_DOUBLE + 16,
CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17,
CURLINFO_CONTENT_TYPE     = CURLINFO_STRING + 18,
CURLINFO_REDIRECT_TIME    = CURLINFO_DOUBLE + 19,
CURLINFO_REDIRECT_COUNT   = CURLINFO_LONG   + 20,
CURLINFO_PRIVATE          = CURLINFO_STRING + 21,
CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG   + 22,
CURLINFO_HTTPAUTH_AVAIL   = CURLINFO_LONG   + 23,
CURLINFO_PROXYAUTH_AVAIL  = CURLINFO_LONG   + 24,
CURLINFO_OS_ERRNO         = CURLINFO_LONG   + 25,
CURLINFO_NUM_CONNECTS     = CURLINFO_LONG   + 26,
CURLINFO_SSL_ENGINES      = CURLINFO_SLIST  + 27,
CURLINFO_COOKIELIST       = CURLINFO_SLIST  + 28,
CURLINFO_LASTSOCKET       = CURLINFO_LONG   + 29,
CURLINFO_FTP_ENTRY_PATH   = CURLINFO_STRING + 30,
CURLINFO_REDIRECT_URL     = CURLINFO_STRING + 31,
CURLINFO_PRIMARY_IP       = CURLINFO_STRING + 32,
CURLINFO_APPCONNECT_TIME  = CURLINFO_DOUBLE + 33,
CURLINFO_CERTINFO         = CURLINFO_SLIST  + 34,
CURLINFO_CONDITION_UNMET  = CURLINFO_LONG   + 35,
CURLINFO_RTSP_SESSION_ID  = CURLINFO_STRING + 36,
CURLINFO_RTSP_CLIENT_CSEQ = CURLINFO_LONG   + 37,
CURLINFO_RTSP_SERVER_CSEQ = CURLINFO_LONG   + 38,
CURLINFO_RTSP_CSEQ_RECV   = CURLINFO_LONG   + 39,
CURLINFO_PRIMARY_PORT     = CURLINFO_LONG   + 40,
CURLINFO_LOCAL_IP         = CURLINFO_STRING + 41,
CURLINFO_LOCAL_PORT       = CURLINFO_LONG   + 42,
/* 在下面填入新的条目! */

CURLINFO_LASTONE          = 42
} CURLINFO;

/* CURLINFO_RESPONSE_CODE 选型以前的名字时
CURLINFO_HTTP_CODE */
#define 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 /* last, never use this */
} curl_closepolicy;

#define CURL_GLOBAL_SSL (1<<0)
#define CURL_GLOBAL_WIN32 (1<<1)
#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32)
#define CURL_GLOBAL_NOTHING 0
#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL

/*****************************************************************************
* 设置定义,PROTOS等共享的东西。
*/

/* 为不同的数据添加一个单一的共享锁 */
typedef enum {
CURL_LOCK_DATA_NONE = 0,
/*  CURL_LOCK_DATA_SHARE 是内部使用
*  锁定只是改变内部共享状态本身
*
*/
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 void CURLSH;

typedef enum {
CURLSHE_OK,  /* 一切 正常 */
CURLSHE_BAD_OPTION, /* 1 */
CURLSHE_IN_USE,     /* 2 */
CURLSHE_INVALID,    /* 3 */
CURLSHE_NOMEM,      /* 4 超出内存 */
CURLSHE_NOT_BUILT_IN, /* 5 功能库中不存在的 */
CURLSHE_LAST        /* never use */
} CURLSHcode;

typedef enum {
CURLSHOPT_NONE,  /* don't use */
CURLSHOPT_SHARE,   /* 指定数据类型分享 */
CURLSHOPT_UNSHARE, /* 指定停止共享的数据类型 */
CURLSHOPT_LOCKFUNC,   /* 通过一个 'curl_lock_function' 指针 */
CURLSHOPT_UNLOCKFUNC, /* 通过一个 'curl_unlock_function' 指针 */
CURLSHOPT_USERDATA,   /* 通过一个用户使用的数据指针 锁定/解锁 回调函数 */
CURLSHOPT_LAST  /* never use */
} CURLSHoption;

CURL_EXTERN CURLSH *curl_share_init(void);
CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...);
CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *);

/****************************************************************************
* 查询 curl 库,运行时的 结构信息
*/

typedef enum {
CURLVERSION_FIRST,
CURLVERSION_SECOND,
CURLVERSION_THIRD,
CURLVERSION_FOURTH,
CURLVERSION_LAST /* 从来没有真正使用 */
} CURLversion;

/*  'CURLVERSION_NOW' 符号名 基本所有的程序都希望得到的版本信息. 它意味着可以根据版本号预测结构信息. 如果结构都没有改变我们重新从上面定义一个枚举. */
#define CURLVERSION_NOW CURLVERSION_FOURTH

typedef struct {
CURLversion age;          /* 返回的struct年龄 */
const char *version;      /* LIBCURL_VERSION */
unsigned int version_num; /* LIBCURL_VERSION_NUM */
const char *host;         /* OS/host/cpu/machine when configured */
int features;             /* bitmask, 请参阅下面的定义 */
const char *ssl_version;  /* 可读的字符串 */
long ssl_version_num;     /*不再使用,总是 0*/
const char *libz_version; /* 可读的字符串 */
/* 使用一个 NULL protoname 时协议会终止
const char * const *protocols;

/*  CURLVERSION_SECOND 添加了下面的字段*/
const char *ares;
int ares_num;

/* 这些字段在 CURLVERSION_THIRD 里面添加了*/
const char *libidn;

/* 这些字段在 CURLVERSION_FOURTH 里面添加了 */

/* 如果使用 HAVE_ICONV 构建和  '_libiconv_version' */
int iconv_ver_num;

const char *libssh_version; /* 可读的字符串 */

} curl_version_info_data;

#define CURL_VERSION_IPV6      (1<<0)  /* IPv6-enabled */
#define CURL_VERSION_KERBEROS4 (1<<1)  /* Kerberos身份验证的支持*/
#define CURL_VERSION_SSL       (1<<2)  /* SSL 选项都存在*/
#define CURL_VERSION_LIBZ      (1<<3)  /* libz 存在的特点 */
#define CURL_VERSION_NTLM      (1<<4)  /* 支持NTLM身份验证*/
#define CURL_VERSION_GSSNEGOTIATE (1<<5) /*支持 Negotiate(协商) 认证 */
#define CURL_VERSION_DEBUG     (1<<6)  /* 内置调试功能*/
#define CURL_VERSION_ASYNCHDNS (1<<7)  /* 异步DNS解析 */
#define CURL_VERSION_SPNEGO    (1<<8)  /* SPNEGO 认证 */
#define CURL_VERSION_LARGEFILE (1<<9)  /* 支持大于 2GB 的文件 */
#define CURL_VERSION_IDN       (1<<10) /* 国际域名支持(万维网域名支持) */
#define CURL_VERSION_SSPI      (1<<11) /* 支持 SSPI */
#define CURL_VERSION_CONV      (1<<12) /* 支持字符转换*/
#define CURL_VERSION_CURLDEBUG (1<<13) /* 支持调试内存跟踪*/
#define CURL_VERSION_TLSAUTH_SRP (1<<14) /* TLS-SRP 支持授权 */
#define CURL_VERSION_NTLM_WB   (1<<15) /* NTLM 是 winbind 的代理助手 */

/*
* NAME curl_version_info()
*
* DESCRIPTION
*
* 这个函数返回一个指针的静态副本版本信息
* 结构。见上文。
*/
CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion);

/*
* NAME curl_easy_strerror()
*
* DESCRIPTION
*
* curl_easy_strerror 功能可用于打开一个 CURLSHcode
* 可能遇到可读的字符串错误。这是非常有用的
* 打印错误信息.
*/
CURL_EXTERN const char *curl_easy_strerror(CURLcode);

/*
* NAME curl_share_strerror()
*
* DESCRIPTION
*
*  curl_share_strerror 功能可用于打开一个 CURLSHcode
* 可能遇到可读的字符串错误。这是非常有用的
* 打印错误信息.
*/
CURL_EXTERN const char *curl_share_strerror(CURLSHcode);

/*
* NAME curl_easy_pause()
*
* 说明
*
*  curl_easy_pause 的 暂停/取消暂停 功能。通过设置 bitmask(位掩码)选择一个新的状态
* 方便使用下面的定义
*
*/
CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask);

#define CURLPAUSE_RECV      (1<<0)
#define CURLPAUSE_RECV_CONT (0)

#define CURLPAUSE_SEND      (1<<2)
#define CURLPAUSE_SEND_CONT (0)

#define CURLPAUSE_ALL       (CURLPAUSE_RECV|CURLPAUSE_SEND)
#define CURLPAUSE_CONT      (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT)

#ifdef  __cplusplus
}
#endif

/* 不幸的是 , easy.h 、 multi.h  在它们包含东西之前,它们需要 options 、 info! */
#include "easy.h" /* (没有简单的东西,curl什么功能也没有)nothing in curl is fun without the easy stuff */
#include "multi.h"

/*  typechecker(类型检查)在 C++ 中不工作(yet) */
#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \
((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \
!defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK)
#include "typecheck-gcc.h"
#else
#if defined(__STDC__) && (__STDC__ >= 1)
/* 通过这三个参数确定应用的作者,这些预处理函数取代了相同功能的回调
*/
#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param)
#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg)
#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param)
#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param)
#endif /* __STDC__ >= 1 */
#endif /* gcc >= 4.3 && !__cplusplus */

#endif /* __CURL_CURL_H */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: