acl  3.5.3.0
lib_http_util.h
浏览该文件的文档.
1 #ifndef __LIB_HTTP_UTIL_INCLUDE_H__
2 #define __LIB_HTTP_UTIL_INCLUDE_H__
3 
4 #include "lib_http_struct.h"
5 
6 #ifdef __cplusplus
7 extern "C" {
8 #endif
9 
10 typedef struct HTTP_UTIL {
11  HTTP_HDR_REQ *hdr_req; /**< HTTP 请求头 */
12  HTTP_HDR_RES *hdr_res; /**< HTTP 响应头 */
13  HTTP_RES *http_res; /**< HTTP 响应体 */
14  char server_addr[256]; /**< 远程 HTTP 服务器地址 */
15  ACL_VSTREAM *stream; /**< 与 HTTP 服务器建立的网络流 */
16  int conn_timeout; /**< 连接 HTTP 服务器的超时时间 */
17  int rw_timeout; /**< 与 HTTP 服务器通信时每次 IO 的超时时间 */
18  ACL_VSTRING *req_buf; /**< 缓冲区 */
19  int res_body_dlen; /**< HTTP 响应数据体的长度 */
20  ACL_VSTREAM *dump_stream; /**< 转储接收数据的流 */
21  unsigned int flag; /**< 标志位 */
22 #define HTTP_UTIL_FLAG_SET_DUMP_FILE (1 << 0) /**< 允许转储响应体至文件 */
23 #define HTTP_UTIL_FLAG_SET_DUMP_STREAM (1 << 1) /**< 允许转储响应体至流 */
24 #define HTTP_UTIL_FLAG_HAS_RES_BODY (1 << 2) /**< 有 HTTP 响应体 */
25 #define HTTP_UTIL_FLAG_NO_RES_BODY (1 << 3) /**< 无 HTTP 响应体 */
26 } HTTP_UTIL;
27 
28 /**
29  * 创建一个 HTTP_UTIL 请求对象
30  * @param url {const char*} 完整的请求 url
31  * @param method {const char*} 请求方法,有效的请求方法有:GET, POST, HEAD, CONNECT
32  * @return {HTTP_UTIL*}
33  */
34 HTTP_API HTTP_UTIL *http_util_req_new(const char *url, const char *method);
35 
36 /**
37  * 构建一个 HTTP_UTIL 响应对象
38  * @param status {int} 状态码,有效的状态码为: 1xx, 2xx, 3xx, 4xx, 5xx
39  * @return {HTTP_UTIL*}
40  */
42 
43 /**
44  * 释放一个 HTTP_UTIL 对象
45  * @param http_util {HTTP_UTIL*}
46  */
47 HTTP_API void http_util_free(HTTP_UTIL *http_util);
48 
49 /**
50  * 设置 HTTP 请求头信息, 如: Accept-Encoding: gzip,deflate
51  * @param http_util {HTTP_UTIL*}
52  * @param name {const char*} 请求头中字段名称, 如 Accept-Encoding
53  * @param value {const char*} 请求头中字段的值, 如 gzip,deflate
54  */
55 HTTP_API void http_util_set_req_entry(HTTP_UTIL *http_util, const char *name, const char *value);
56 
57 /**
58  * 关闭 HTTP 请求头中的某个请求字段,该请求字段不会发往服务器
59  * @param http_util {HTTP_UTIL*}
60  * @param name {const char*} 请求头中字段名称, 如 Accept-Encoding
61  */
62 HTTP_API void http_util_off_req_entry(HTTP_UTIL *http_util, const char *name);
63 
64 /**
65  * 获得请求头中某个字段的值
66  * @param http_util {HTTP_UTIL*}
67  * @param name {const char*} 请求头中字段名称, 如 Accept-Encoding
68  * @return {char*} 如果非空则为请求字段值,否则表明该字段不存在
69  */
70 HTTP_API char *http_util_get_req_value(HTTP_UTIL *http_util, const char *name);
71 
72 /**
73  * 获得请求头中某个字段的 HTTP_HDR_ENTRY 对象
74  * @param http_util {HTTP_UTIL*}
75  * @param name {const char*} 请求头中字段名称, 如 Accept-Encoding
76  * @return {HTTP_HDR_ENTRY*} 若为空则表示该字段不存在
77  */
79 
80 /**
81  * 设置请求头中 HTTP 数据体的数据长度
82  * @param http_util {HTTP_UTIL*}
83  * @param len {int} HTTP 数据体长度(必须 >= 0)
84  */
85 HTTP_API void http_util_set_req_content_length(HTTP_UTIL *http_util, int len);
86 
87 /**
88  * 设置请求头中 HTTP 会话保持长连接的存活时间(单位为秒)
89  * @param http_util {HTTP_UTIL*}
90  * @param timeout {int} HTTP 长连接的存活时间(单位为秒)
91  */
92 HTTP_API void http_util_set_req_keep_alive(HTTP_UTIL *http_util, int timeout);
93 
94 /**
95  * 设置请求头中 Connection 字段
96  * @param http_util {HTTP_UTIL*}
97  * @param value {const char*} 字段值,有效的字段为: keep-alive, close
98  */
99 HTTP_API void http_util_set_req_connection(HTTP_UTIL *http_util, const char *value);
100 
101 /**
102  * 设置请求头中的 Referer 字段
103  * @param http_util {HTTP_UTIL*}
104  * @param refer {const char*} 完整的 url, 如: http://www.test.com
105  */
106 HTTP_API void http_util_set_req_refer(HTTP_UTIL *http_util, const char *refer);
107 
108 /**
109  * 设置请求头中的 Cookie 字段,采用的是追加方式
110  * @param http_util {HTTP_UTIL*}
111  * @param name {const char*} Cookie 名称
112  * @param value {const char*} Cookie 值
113  */
114 HTTP_API void http_util_set_req_cookie(HTTP_UTIL *http_util, const char *name, const char *value);
115 
116 /**
117  * 设置 HTTP 代理服务器地址
118  * @param http_util {HTTP_UTIL*}
119  * @param proxy {const char*} 代理服务器地址,有效格式为: IP:PORT, DOMAIN:PORT,
120  * 如: 192.168.0.1:80, 192.168.0.2:8088, www.g.cn:80
121  */
122 HTTP_API void http_util_set_req_proxy(HTTP_UTIL *http_util, const char *proxy);
123 
124 /**
125  * 设置 HTTP 响应体的转储流,设置后 HTTP 响应体数据便会同时向该流转发
126  * @param http_util {HTTP_UTIL*}
127  * @param stream {ACL_VSTREAM *} 转储流
128  */
129 HTTP_API void http_util_set_dump_stream(HTTP_UTIL *http_util, ACL_VSTREAM *stream);
130 
131 /**
132  * 设置 HTTP 响应体的转储文件,设置后 HTTP 响应体数据便会转储于该文件
133  * @param http_util {HTTP_UTIL*}
134  * @param filename {const char*} 转储文件名
135  * @return {int} 如果返回值 < 0 则表示无法打开该文件, 否则表示打开文件成功
136  */
137 HTTP_API int http_util_set_dump_file(HTTP_UTIL *http_util, const char *filename);
138 
139 /**
140  * 打开远程 HTTP 服务器或代理服务器连接,同时构建 HTTP 请求头数据并且将该数据
141  * 发给新建立的网络连接
142  * @param http_util {HTTP_UTIL*}
143  * @return {int} 0: 成功; -1: 无法打开连接或发送请求头数据失败
144  */
145 HTTP_API int http_util_req_open(HTTP_UTIL *http_util);
146 
147 /**
148  * 当采用 POST 方法时,可以通过此函数向 HTTP 服务器或代理服务器发送请求体数据,
149  * 在一个请求过程中,可以多次调用本函数直至发送完请求体数据
150  * @param http_util {HTTP_UTIL*}
151  * @param data {const char*} 本次发送的数据地址,必须非空
152  * @param dlen {size_t} data 数据长度, 必须大于 0
153  * @return {int} > 0 表示本次成功发送的数据; -1: 表示发送数据失败, 应调用
154  * http_util_free 关闭网络流且释放内存资源
155  */
156 HTTP_API int http_util_put_req_data(HTTP_UTIL *http_util, const char *data, size_t dlen);
157 
158 /**
159  * 发送完请求数据后调用此函数从 HTTP 服务器读取完整的 HTTP 响应头
160  * @param http_util {HTTP_UTIL*}
161  * @return {int} 0: 成功; -1: 失败
162  */
164 
165 /**
166  * 从 HTTP 响应头中获得某个字段值
167  * @param http_util {HTTP_UTIL*}
168  * @param name {const char*} 字段名称, 如 Content-Length
169  * @return {char*} 对应 name 的字段值, 如果为空则表示该字段不存在
170  */
171 HTTP_API char *http_util_get_res_value(HTTP_UTIL *http_util, const char *name);
172 
173 /**
174  * 从 HTTP 响应头中获得某个字段对象
175  * @param http_util {HTTP_UTIL*}
176  * @param name {const char*} 字段名称, 如 Content-Length
177  * @return {HTTP_HDR_ENTRY*} 对应 name 的字段对象, 如果为空则表示该字段不存在
178  */
180 
181 /**
182  * 设置 HTTP 响应头中的某个字段值
183  * @param http_util {HTTP_UTIL*}
184  * @param name {const char*} 字段名称, 如 Content-Type
185  * @param value {const char*} 字段值, 如 text/html
186  */
187 HTTP_API void http_util_set_res_entry(HTTP_UTIL *http_util, const char *name, const char *value);
188 
189 /**
190  * 关闭 HTTP 响应头中的某个字段
191  * @param http_util {HTTP_UTIL*}
192  * @param name {const char*} 字段名称, 如 Content-Type
193  */
194 HTTP_API void http_util_off_res_entry(HTTP_UTIL *http_util, const char *name);
195 
196 /**
197  * 读完 HTTP 响应头后调用此函数判断是否有 HTTP 响应体
198  * @param http_util {HTTP_UTIL*}
199  * @return {int} 0: 表示无响应体; !0: 表示有响应体
200  */
202 
203 /**
204  * 读完 HTTP 响应头后调用此函数从 HTTP 服务器读取 HTTP 数据体数据,需要连续调用
205  * 此函数,直至返回值 <= 0, 如果之前设置了转储文件或转储则在读取数据过程中同时会
206  * 拷贝一份数据给转储文件或转储流
207  * @param http_util {HTTP_UTIL*}
208  * @param buf {char *} 存储 HTTP 响应体的缓冲区
209  * @param size {size_t} buf 的空间大小
210  * @return {int} <= 0: 表示读结束; > 0: 表示本次读到的数据长度
211  */
212 HTTP_API int http_util_get_res_body(HTTP_UTIL *http_util, char *buf, size_t size);
213 
214 /**
215  * 将某个 url 的响应体数据转储至某个文件中
216  * @param url {const char*} 完整请求 url, 如: http://www.g.cn
217  * @param dump {const char*} 转储文件名
218  * @return {int} 读到的响应体数据长度, >=0: 表示成功, -1: 表示失败
219  */
220 HTTP_API int http_util_dump_url(const char *url, const char *dump);
221 
222 /**
223  * 将某个 url 的响应体数据转储至某个流中
224  * @param url {const char*} 完整请求 url, 如: http://www.g.cn
225  * @param stream {ACL_VSTREAM *} 转储流
226  * @return {int} 读到的响应体数据长度, >=0: 表示成功, -1: 表示失败
227  */
228 HTTP_API int http_util_dump_url_to_stream(const char *url, ACL_VSTREAM *stream);
229 
230 #ifdef __cplusplus
231 }
232 #endif
233 
234 #endif
HTTP_API char * http_util_get_res_value(HTTP_UTIL *http_util, const char *name)
int conn_timeout
Definition: lib_http_util.h:16
HTTP_API void const char * name
Definition: lib_http.h:620
HTTP_API HTTP_HDR_ENTRY * http_util_get_res_entry(HTTP_UTIL *http_util, const char *name)
HTTP_API int http_util_get_res_hdr(HTTP_UTIL *http_util)
HTTP_API void http_util_off_res_entry(HTTP_UTIL *http_util, const char *name)
#define HTTP_API
HTTP_API void http_util_set_req_content_length(HTTP_UTIL *http_util, int len)
HTTP_API void http_util_set_req_keep_alive(HTTP_UTIL *http_util, int timeout)
int rw_timeout
Definition: lib_http_util.h:17
HTTP_API HTTP_HDR_ENTRY * http_util_get_req_entry(HTTP_UTIL *http_util, const char *name)
HTTP_API void http_util_free(HTTP_UTIL *http_util)
HTTP_API void http_util_set_req_connection(HTTP_UTIL *http_util, const char *value)
ACL_VSTREAM * stream
Definition: lib_http_util.h:15
int res_body_dlen
Definition: lib_http_util.h:19
HTTP_API int http_util_has_res_body(HTTP_UTIL *http_util)
HTTP_API void http_util_set_dump_stream(HTTP_UTIL *http_util, ACL_VSTREAM *stream)
unsigned int flag
Definition: lib_http_util.h:21
HTTP_API HTTP_UTIL * http_util_req_new(const char *url, const char *method)
HTTP_API void http_util_set_req_cookie(HTTP_UTIL *http_util, const char *name, const char *value)
HTTP_API int http_util_set_dump_file(HTTP_UTIL *http_util, const char *filename)
struct HTTP_UTIL HTTP_UTIL
HTTP_API void http_util_off_req_entry(HTTP_UTIL *http_util, const char *name)
HTTP_API int http_util_get_res_body(HTTP_UTIL *http_util, char *buf, size_t size)
HTTP_HDR_RES * hdr_res
Definition: lib_http_util.h:12
HTTP_API int http_util_put_req_data(HTTP_UTIL *http_util, const char *data, size_t dlen)
char server_addr[256]
Definition: lib_http_util.h:14
ACL_VSTRING * req_buf
Definition: lib_http_util.h:18
HTTP_RES * http_res
Definition: lib_http_util.h:13
HTTP_API HTTP_UTIL * http_util_res_new(int status)
ACL_VSTREAM * dump_stream
Definition: lib_http_util.h:20
HTTP_API int http_util_dump_url_to_stream(const char *url, ACL_VSTREAM *stream)
HTTP_API void http_util_set_req_entry(HTTP_UTIL *http_util, const char *name, const char *value)
HTTP_API char * http_util_get_req_value(HTTP_UTIL *http_util, const char *name)
HTTP_API void http_util_set_res_entry(HTTP_UTIL *http_util, const char *name, const char *value)
HTTP_API int http_util_dump_url(const char *url, const char *dump)
HTTP_HDR_REQ * hdr_req
Definition: lib_http_util.h:11
HTTP_API int http_util_req_open(HTTP_UTIL *http_util)
HTTP_API void http_util_set_req_proxy(HTTP_UTIL *http_util, const char *proxy)
HTTP_API void http_util_set_req_refer(HTTP_UTIL *http_util, const char *refer)