acl  3.5.3.0
lib_http.h
浏览该文件的文档.
1 #ifndef __LIB_HTTP_INCLUDE_H__
2 #define __LIB_HTTP_INCLUDE_H__
3 
4 #include "lib_http_status.h"
5 #include "lib_http_struct.h"
6 
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 
11 /*---------------------------- 通用 HTTP 头操作函数 --------------------------*/
12 /* in http_hdr.c */
13 
14 /**
15  * 生成一个通用HTTP协议头的结构对象
16  * @param size {size_t} 所需分配内存大小, 等于 HTTP_HDR_REQ 或 HTTP_HDR_RES 的尺寸
17  * @return {HTTP_HDR*} !NULL: 返回一个HTTP_HDR结构指针; NULL: 出错.
18  */
19 HTTP_API HTTP_HDR *http_hdr_new(size_t size);
20 
21 /**
22  * 从源HTTP通用头拷贝内部成员变量至一个新的HTTP通用头结构中
23  * @param src {const HTTP_HDR*} 源HTTP通用头对象,不能为空
24  * @param dst {HTTP_HDR*} 目的HTTP通用头对象,不能为空
25  */
26 HTTP_API void http_hdr_clone(const HTTP_HDR *src, HTTP_HDR *dst);
27 
28 /**
29  * 释放一个HTTP_HDR结构内存
30  * @param hh {HTTP_HDR*} 类型的数据指针,不能为空
31  */
33 
34 /**
35  * 重置一个HTTP通用头的状态,释放内部成员变量,主要用于keep-alive的长连接多次请求
36  * @param hh {HTTP_HDR*} HTTP通用头类型的数据指针,不能为空
37  */
39 
40 /**
41  * 向 HTTP_HDR 头中增加一个条目
42  * @param hh {HTTP_HDR*} 通用头类型的数据指针,不能为空
43  * @param entry {HTTP_HDR_ENTRY*} HTTP头条目结构指针, 不能为空
44  */
46 
47 /**
48  * 分析所给数据, 解析出协议, 主/次版本号,并将结果存在通用HTTP头结构内
49  * @param hh {HTTP_HDR*} 类型的数据指针,不能为空
50  * @param data {const char*} 数据格式须为: HTTP/1.0
51  * @return {int} 0: OK; < 0: error.
52  */
53 HTTP_API int http_hdr_parse_version(HTTP_HDR *hh, const char *data);
54 
55 /**
56  * 分析所有的通用HTTP协议头并存储在 hh 结构中
57  * @param hh {HTTP_HDR*} 通用HTTP头类型的数据指针,不能为空
58  * @return {int} 0: ok; < 0: error
59  */
61 
62 /**
63  * 由传入的 name, value 对产生一个 HTTP_HDR_ENTRY 对象
64  * @param name {const char*} 变量名
65  * @param value {const char*} 变量值
66  * @return {HTTP_HDR_ENTRY*} 如果为空则是因为输入参数有误
67  */
68 HTTP_API HTTP_HDR_ENTRY *http_hdr_entry_build(const char *name, const char *value);
69 
70 /**
71  * 根据传入的一行数据进行分析, 生成一个 HTTP_HDR_ENTRY
72  * @param data {const char*} HTTP 协议头中的一行数据, 如: Content-Length: 200
73  * @return {HTTP_HDR_ENTRY*} !NULL: ok; NULL: err.
74  */
75 HTTP_API HTTP_HDR_ENTRY *http_hdr_entry_new(const char *data);
78 
79 /**
80  * 获取一个 HTTP_HDR_ENTRY 条目
81  * @param hh {HTTP_HDR*} 通用HTTP头类型的数据指针,不能为空
82  * @param name {const char*} 该 HTTP_HDR_ENTRY 条目的标识名, 不能为空. 如: Content-Length.
83  * @return ret {HTTP_HDR_ENTRY *} ret != NULL: ok; ret == NULL: 出错或不存在.
84  */
85 HTTP_API HTTP_HDR_ENTRY *http_hdr_entry(const HTTP_HDR *hh, const char *name);
86 
87 /**
88  * 获取HTTP协议头里某个实体头的变量值,如某个实体头为:Host: www.test.com
89  * 要获得 Host 变量的值,调用该函数后便可以取得 www.test.com
90  * @param hh {HTTP_HDR*} 通用HTTP头类型的数据指针,不能为空
91  * @param name {const char*} 该 HTTP_HDR_ENTRY 条目的标识名, 不能为空. 如: Content-Length
92  * @return ret {char*} ret != NULL: ok; ret == NULL: 出错或不存在.
93  */
94 HTTP_API char *http_hdr_entry_value(const HTTP_HDR *hh, const char *name);
95 
96 /**
97  * 将 HTTP 头中的某个字段进行替换, 该功能起初主要是为了实现 keep-alive 字段的替换
98  * @param hh {HTTP_HDR*} 通用HTTP头类型的数据指针,不能为空
99  * @param name {const char*} 该 HTTP_HDR_ENTRY 条目的标识名, 不能为空. 如: Content-Length
100  * @param value {const char*} 该 name 字段所对应的新的值
101  * @param force {int} 如果所替换的字段在原始HTTP请求里不存在, 则强行产生新的 entry 字段并
102  * 填至该请求头, 当该值为非0值时进行强行添加, 否则若该name在请求里不存在则不添加.
103  * @return {int} 0 表示替换成功; < 0 表示输入参数出错或该 name 字段在该HTTP请求头里不存在
104  */
105 HTTP_API int http_hdr_entry_replace(HTTP_HDR *hh, const char *name, const char *value, int force);
106 
107 /**
108  * 将 HTTP 头中的某个字段中包含某个字符串的源字符串进行替换, 可以支持多次匹配替换
109  * @param hh {HTTP_HDR*} 通用HTTP头类型的数据指针,不能为空
110  * @param name {const char*} 该 HTTP_HDR_ENTRY 条目的标识名, 不能为空. 如: Cookie
111  * @param from {const char*} 替换时的源字符串
112  * @param to {const char*} 替换时的目标字符串
113  * @param ignore_case {int} 在查找替换时是否忽略源字符串的大小写
114  * @return {int} 0: 表示未做任何替换, > 0: 表示替换的次数
115  */
116 HTTP_API int http_hdr_entry_replace2(HTTP_HDR *hh, const char *name,
117  const char *from, const char *to, int ignore_case);
118 
119 /**
120  * 禁止HTTP协议头中的某项
121  * @param hh {HTTP_HDR* } 通用HTTP头类型的数据指针,不能为空
122  * @param name {const char*} 该 HTTP_HDR_ENTRY 条目的标识名, 不能为空. 如: Content-Length
123  */
124 HTTP_API void http_hdr_entry_off(HTTP_HDR *hh, const char *name);
125 
126 /**
127  * 调试输出HTTP协议头部数据,调试类接口
128  * @param hh {HTTP_HDR*} 通用HTTP头类型的数据指针,不能为空
129  * @param msg {const char*} 用户希望与头部信息一起输出的自定义信息, 可以为空
130  */
131 HTTP_API void http_hdr_print(const HTTP_HDR *hh, const char *msg);
132 
133 /**
134  * 调试输出HTTP协议头部数据,调试类接口
135  * @param fp {ACL_VSTREAM*} 某个流指针,输出结果将会定向至该数据流(可以为网络流或文件流)
136  * @param hh {HTTP_HDR*} 通用HTTP头类型的数据指针,不能为空
137  * @param msg {const char*} 用户希望与头部信息一起输出的自定义信息, 可以为空
138 */
139 HTTP_API void http_hdr_fprint(ACL_VSTREAM *fp, const HTTP_HDR *hh, const char *msg);
140 
141 /**
142  * 调试输出HTTP协议头部数据,调试类接口
143  * @param bf {ACL_VSTRING*} 输出结果将会定向至该缓冲区
144  * @param hh {HTTP_HDR*} 通用HTTP头类型的数据指针,不能为空
145  * @param msg {const char*} 用户希望与头部信息一起输出的自定义信息, 可以为空
146 */
147 HTTP_API void http_hdr_sprint(ACL_VSTRING *bf, const HTTP_HDR *hh, const char *msg);
148 
149 /*-------------------------------- HTTP 请求头操作函数 -----------------------*/
150 /* in http_hdr_req.c */
151 
152 /**
153  * 设置标志位,针对 HTTP 请求的 URI 中的 ? 问号被转义(即被转成 %3F)的请求是否做兼容性处理
154  * @param onoff {int} 为非 0 值时表示做兼容性处理,内部缺省值为 1
155  */
156 HTTP_API void http_uri_correct(int onoff);
157 
158 /**
159  * 分配一个请求的HTTP协议头对象
160  * @return {HTTP_HDR_REQ*} HTTP请求头对象
161  */
163 
164 /**
165  * 根据请求的URL,请求的方法,HTTP版本创建一个HTTP请求头对象
166  * @param url {const char*} 请求的URL,必须是完整的URL,如:
167  * http://www.test.com/path/proc?name=value
168  * http://www.test.com/path/proc
169  * http://www.test.com/
170  * @param method {const char*} HTTP请求方法,必须为如下之一:
171  * GET, POST, CONNECT, HEAD, 且要注意必须都为大写
172  * @param version {const char *} HTTP版本,必须为如下之一:
173  * HTTP/1.0, HTTP/1.1
174  * @return {HTTP_HDR_REQ*} HTTP请求头对象
175  */
176 HTTP_API HTTP_HDR_REQ *http_hdr_req_create(const char *url,
177  const char *method, const char *version);
178 
179 /**
180  * 克隆一个HTTP请求头对象,但不复制其中的 chat_ctx, chat_free_ctx_fn
181  * 两个成员变量
182  * @param hdr_req {const HTTP_HDR_REQ*} HTTP请求头对象
183  * @return {HTTP_HDR_REQ*} 克隆的HTTP请求头对象
184  */
186 
187 /**
188  * 根据上次HTTP请求头内容及重定向的URL产生一个新的HTTP请求头
189  * @param hh {const HTTP_HDR_REQ*} 上次的HTTP请求头对象
190  * @param url {const char *} 重定向的URL,如果有 http[s]:// 前缀,则认为
191  * 是完整的URL,新的 Host 字段将由该URL中提取,否则则继承源HTTP请求头中
192  * 的 Host 字段
193  * @return {HTTP_HDR_REQ*} 新产生的重定向的HTTP请求头
194  */
195 HTTP_API HTTP_HDR_REQ *http_hdr_req_rewrite(const HTTP_HDR_REQ *hh, const char *url);
196 
197 /**
198  * 根据HTTP请求头内容及重定向的URL重新设置该HTTP请求头的信息
199  * @param hh {const HTTP_HDR_REQ*} 上次的HTTP请求头对象
200  * @param url {const char *} 重定向的URL,如果有 http[s]:// 前缀,则认为
201  * 是完整的URL,新的 Host 字段将由该URL中提取,否则则继承源HTTP请求头中
202  * 的 Host 字段
203  * @return {int} 0: ok; < 0: error
204  */
205 HTTP_API int http_hdr_req_rewrite2(HTTP_HDR_REQ *hh, const char *url);
206 
207 /**
208  * 释放HTTP请求头对象
209  * @param hh {HTTP_HDR_REQ*} HTTP请求头对象
210  */
212 
213 /**
214  * 将HTTP请求头对象的成员变量释放并重新初始化
215  * @param hh {HTTP_HDR_REQ*} HTTP请求头对象
216  */
218 
219 /**
220  * 分析HTTP协议头的cookies
221  * @param hh {HTTP_HDR_REQ*} HTTP请求头类型的数据指针,不能为空
222  * @return {int} 0: ok; -1: err.
223  */
225 
226 /**
227  * 分析HTTP请求首行数据(如: GET /cgi-bin/test.cgi?name=value&name2=value2 HTTP/1.0)
228  * 请求的方法(GET)-->hdr_request_method
229  * URL数据分析结果(name=value)-->hdr_request_table
230  * HTTP协议版本号(HTTP/1.0)-->hdr_request_proto
231  * URL数据中的路径部分(/cgi-bin/test.cgi)-->hdr_request_url
232  * @param hh {HTTP_HDR_REQ*} HTTP请求头类型的数据指针,不能为空
233  * @return {int} 0: ok; -1: err.
234  */
236 
237 /**
238  * 分析HTTP请求头协议数据, 其内部会调用 http_hdr_req_line_parse, http_hdr_req_cookies_parse
239  * @param hh {HTTP_HDR_REQ*} HTTP请求头类型的数据指针,不能为空
240  * @return {int} 0: ok; -1: err.
241  */
243 
244 /**
245  * 分析HTTP请求头协议数据, 其内部会调用 http_hdr_req_line_parse, http_hdr_req_cookies_parse
246  * 如果 parse_params 非 0 则分析HTTP请求 url 中的参数部分; 如果 parse_cookie 非 0 则分析
247  * HTTP请求中的 cookie 内容
248  * @param hh {HTTP_HDR_REQ*} HTTP请求头类型的数据指针,不能为空
249  * @param parse_params {int} 是否分析请求 url 中的参数部分
250  * @param parse_cookie {int} 是否分析请求中的 cookie 内容
251  * @return {int} 0: ok; -1: err.
252  */
253 HTTP_API int http_hdr_req_parse3(HTTP_HDR_REQ *hh, int parse_params, int parse_cookie);
254 
255 /**
256  * 从HTTP请求头中获得某个cookie值
257  * @param hh {HTTP_HDR_REQ*) HTTP请求头类型的数据指针,不能为空
258  * @param name {const char*} 某个cookie的变量名, 不能为空
259  * @return {const char*} !NULL: 该返回值即为所要求的cookie; NULL: 出错或所要求的cookie不存在
260  */
261 HTTP_API const char *http_hdr_req_cookie_get(HTTP_HDR_REQ *hh, const char *name);
262 
263 /**
264  * 从HTTP请求头中取得HTTP请求的方法, 如: POST, GET, CONNECT
265  * @param hh {const HTTP_HDR_REQ*} HTTP请求头类型的数据指针,不能为空
266  * @return {const char*} 返回请示方法. NULL: error; !NULL: OK.
267  */
268 HTTP_API const char *http_hdr_req_method(const HTTP_HDR_REQ *hh);
269 
270 /**
271  * 从HTTP请求头中获取请求URL中某个请求字段的数据,
272  * 如取: /cgi-bin/test.cgi?n1=v1&n2=v2 中的 n2的值v2
273  * @param hh {const HTTP_HDR_REQ*} HTTP请求头类型的数据指针,不能为空
274  * @param name {const char*} 请求参数中的变量名
275  * @return {const char*} !NULL: ok, 返回变量值的内存指针; NULL: 出错,或请求的变量名不存在.
276  */
277 HTTP_API const char *http_hdr_req_param(const HTTP_HDR_REQ *hh, const char *name);
278 
279 /**
280  * 从HTTP请求头中获取请求行中的访问路径部分, 不包含主机名但包含参数.
281  * 如原请求行数据为:
282  * GET /cgi-bin/test.cgi?n1=v1&n2=v2 HTTP/1.1
283  * or
284  * GET http://www.test.com[:80]/cgi-bin/test.cgi?n1=v1&n2=v2 HTTP/1.1
285  * 则分析后的结果数据为:
286  * /cgi-bin/test.cgi?n1=v1&n2=v2
287  * @param hh {const HTTP_HDR_REQ*} HTTP请求头类型的数据指针,不能为空
288  * @return {const char*} 请示的URL. !NULL: OK; NULL: error.
289  */
290 HTTP_API const char *http_hdr_req_url_part(const HTTP_HDR_REQ *hh);
291 
292 /**
293  * 从HTTP请求头中获取请求行中的访问路径部分, 不包含主机名及参数.
294  * 如原请求行数据为:
295  * GET /cgi-bin/test.cgi?n1=v1&n2=v2 HTTP/1.1
296  * or
297  * GET http://www.test.com[:80]/cgi-bin/test.cgi?n1=v1&n2=v2 HTTP/1.1
298  * 则分析后的结果数据为:
299  * /cgi-bin/test.cgi
300  * @param hh {const HTTP_HDR_REQ*} HTTP请求头类型的数据指针,不能为空
301  * @return {const char*} 请示的URL. !NULL: OK; NULL: error.
302  */
303 HTTP_API const char *http_hdr_req_url_path(const HTTP_HDR_REQ *hh);
304 
305 /**
306  * 从HTTP请求协议头中获得服务器的主机IP或域名,格式为:IP|domain[:PORT]
307  * 如: 192.168.0.22:80, or www.test.com:8088
308  * @param hh {const HTTP_HDR_REQ*} HTTP请求头类型的数据指针,不能为空
309  * @return {const char*} 返回用户请示的主机名. !NULL: ok; NULL: error.
310  */
311 HTTP_API const char *http_hdr_req_host(const HTTP_HDR_REQ *hh);
312 
313 /**
314  * 从HTTP请求头协议中获得完整的URL请求字符串
315  * 如原HTTP请求头为:
316  * GET /cgi-bin/test.cgi?n1=v1&n2=v2 HTTP/1.1
317  * HOST: www.test.com
318  * 则经该函数后则返回:
319  * http://www.test.com/cgi-bin/test.cgi?n1=v1&n2=v2
320  * @param hh {const HTTP_HDR_REQ*} HTTP请求头类型的数据指针,不能为空
321  * @return {const char*} 请示的URL. !NULL: OK; NULL: error.
322  * @example:
323  * void test(HTTP_HDR_REQ *hh)
324  * {
325  * const char *url = http_hdr_req_url(hh);
326  * printf(">>> url: %s\r\n", url ? url : "null");
327  * }
328  * 注意, 因为 http_hdr_req_url 内部使用到了一个线程局部静态变量内存区, 所以
329  * 不可如下使用,否则会使返回的数据发生重叠.
330  * void test(HTTP_HDR_REQ *hh1, HTTP_HDR_REQ *hh2)
331  * {
332  * const char *url1 = http_hdr_req_url(hh1);
333  * const char *url2 = http_hdr_req_url(hh2);
334  * printf(">>> url1: %s, url2: %s\n", url1, url2);
335  * }
336  * 因为 url1, url2 实际上都是指向的同一内存区, 所以最终的结果将是 url1, url2
337  * 内容相同. 如遇此类情形, 应该如下操作:
338  * void test(HTTP_HDR_REQ *hh1, HTTP_HDR_REQ *hh2)
339  * {
340  * const char *ptr;
341  * static char dummy[1];
342  * char *url1 = dummy, *url2 = dummy;
343  * ptr = http_hdr_req_url(hh1);
344  * if (ptr)
345  * url1 = acl_mystrdup(ptr);
346  * ptr = http_hdr_req_url(hh2);
347  * if (ptr)
348  * url2 = acl_mystrdup(ptr);
349  * printf(">>> url1: %s, url2: %s\n", url1, url2);
350  * if (url1 != dummy)
351  * acl_myfree(url1);
352  * if (url2 != dummy)
353  * acl_myfree(url2);
354  * }
355  */
356 HTTP_API const char *http_hdr_req_url(const HTTP_HDR_REQ *hh);
357 
358 /**
359  * 分析HTTP请求头中的 Range 字段
360  * @param hdr_req {HTTP_HDR_REQ*} 请求HTTP协议头, 不能为空
361  * @param range_from {http_off_t*} 存储偏移起始位置
362  * @param range_to {http_off_t*} 存储偏移结束位置
363  * 注: * {range_from}, {range_to} 下标从0开始
364  * 请求的 Range 格式:
365  * Range: bytes={range_from}-, bytes={range_from}-{range_to}
366  */
367 HTTP_API int http_hdr_req_range(const HTTP_HDR_REQ *hdr_req,
368  http_off_t *range_from, http_off_t *range_to);
369 
370 /*---------------------------- HTTP 响应头操作函数 ---------------------------*/
371 /* in http_hdr_res.c */
372 
373 /**
374  * 分析HTTP响应头中的状态行
375  *@param hh {HTTP_HDR_RES*} HTTP响应头类型的数据指针,不能为空
376  *@param dbuf {const char*} 状态行数据, 如: HTTP/1.0 200 OK,不能为空
377  *@return {int} 0: ok; < 0: error,分析结果存储在 hh 结构中
378  */
379 HTTP_API int http_hdr_res_status_parse(HTTP_HDR_RES *hh, const char *dbuf);
380 
381 /**
382  * 创建一个新的HTTP响应头
383  * @return {HTTP_HDR_RES*}
384  */
386 
387 /**
388  * 克隆一个HTTP响应头
389  * @param hdr_res {const HTTP_HDR_RES*} 源HTTP响应头
390  * @return {HTTP_HDR_RES *} 新产生的HTTP响应头
391  */
393 
394 /**
395  * 释放一个HTTP响应头
396  * @param hh {HTTP_HDR_RES*} HTTP响应头
397  */
399 
400 /**
401  * 向HTTP响应头重新初始化并释放其中的成员变量
402  * @param hh {HTTP_HDR_RES*} HTTP响应头
403  */
405 
406 /**
407  * 分析HTTP响应头里的数据,并存储分析结果
408  * @param hdr_res {HTTP_HDR_RES*} HTTP响应头
409  */
411 
412 /**
413  * 分析HTTP响应头中的 Range 字段
414  * @param hdr_res {HTTP_HDR_RES*} 响应HTTP协议头, 不能为空
415  * @param range_from {http_off_t*} 存储偏移起始位置, 不能为空
416  * @param range_to {http_off_t*} 存储偏移结束位置, 不能为空
417  * @param total_length {http_off_t*} 整个数据文件的总长度, 可为空
418  * @return {int} 返回 0 表示成功,-1 表示失败
419  * 注: * {range_from}, {range_to} 下标从0开始
420  * 响应的 Range 格式:
421  * Content-Range: bytes {range_from}-{range_to}/{total_length}
422  */
423 HTTP_API int http_hdr_res_range(const HTTP_HDR_RES *hdr_res,
424  http_off_t *range_from, http_off_t *range_to, http_off_t *total_length);
425 
426 /* in http_rfc1123.c */
427 
428 /**
429  * 将时间值转换成RFC1123所要求的格式
430  * @param buf {char*} 存储空间
431  * @param size {size_t} buf 的空间大小
432  * @param t {time_t} 时间值
433  */
434 HTTP_API const char *http_mkrfc1123(char *buf, size_t size, time_t t);
435 
436 /*----------------------- HTTP 异步读操作函数 --------------------------------*/
437 /* in http_chat_async.c */
438 
439 /**
440  * 异步获取一个HTTP REQUEST协议头,数据结果存储在hdr中, 当取得一个完整的HTTP头或
441  * 出错时调用用户的注册函数 notify
442  * @param hdr {HTTP_HDR_REQ*} HTTP请求头类型结构指针,不能为空
443  * @param astream {ACL_ASTREAM*} 与客户端连接的数据流, 不能为空
444  * @param notify {HTTP_HDR_NOTIFY} 当HTTP协议头读完或出错时调用的用户的注册函数
445  * @param arg {void*} notify 调用时的一个参数
446  * @param timeout {int} 接收数据过程中的读超时时间
447  */
449  HTTP_HDR_NOTIFY notify, void *arg, int timeout);
450 
451 /**
452  * 异步获取一个HTTP RESPOND协议头,数据结果存储在hdr中, 当取得一个完整的HTTP头或
453  * 出错时调用用户的注册函数 notify
454  * @param hdr {HTTP_HDR_REQ*} HTTP响应头类型结构指针,不能为空
455  * @param astream {ACL_ASTREAM*} 与服务端连接的数据流, 不能为空
456  * @param notify {HTTP_HDR_NOTIFY} 当HTTP协议头读完或出错时调用的用户的注册函数
457  * @param arg {void*} notify 调用时的一个参数
458  * @param timeout {int} 接收数据过程中的读超时时间
459  */
461  HTTP_HDR_NOTIFY notify, void *arg, int timeout);
462 
463 /**
464  * 异步从客户端读取请求的BODY协议体, 在接收过程中边接收连回调用户的 notify
465  * 回调函数, 如果 notify 返回小于 0 的值, 则认为出错且不再继续接收数据
466  * @param request {HTTP_REQ*} HTTP请求体类型指针, 不能为空, 且 request->hdr 为空
467  * @param astream {ACL_ASTREAM*} 与客户端连接的数据流, 不能为空
468  * @param notify {HTTP_BODY_NOTIFY} 接收客户端数据过程中回调的用户的注册函数
469  * @param arg {void*} notify 调用时的一个参数
470  * @param timeout {int} 接收数据过程中的读超时时间
471  */
472 HTTP_API void http_req_body_get_async(HTTP_REQ *request, ACL_ASTREAM *astream,
473  HTTP_BODY_NOTIFY notify, void *arg, int timeout);
474 /*
475  * 异步从服务器端读取响应数据的BODY协议体, 在接收过程中连接收连回调用户的
476  * notify 回调函数, 如果 notify 返回小于 0 的值, 则认为出错且不再继续接收数据
477  * @param respond {HTTP_RES*} HTTP响应体类型指针, 不能为空,且 respond->hdr 不为空
478  * @param astream {ACL_ASTREAM*} 与服务端连接的数据流, 不能为空
479  * @param notify {HTTP_BODY_NOTIFY} 接收服务端数据过程中回调的用户的注册函数
480  * @param arg {void*} notify 调用时的一个参数
481  * @param timeout {int} 接收数据过程中的读超时时间
482  */
483 HTTP_API void http_res_body_get_async(HTTP_RES *respond, ACL_ASTREAM *astream,
484  HTTP_BODY_NOTIFY notify, void *arg, int timeout);
485 
486 /*----------------------- HTTP 同步读操作函数 --------------------------------*/
487 /* in http_chat_sync.c */
488 
489 /**
490 * 同步获取一个HTTP REQUEST协议头,数据结果存储在hdr中, 当取得一个完整的HTTP头或
491 * 出错时调用用户的注册函数 notify
492 * @param hdr {HTTP_HDR_REQ*} HTTP请求头类型结构指针,不能为空
493 * @param stream {ACL_VSTREAM*} 与客户端连接的数据流, 不能为空
494 * @param timeout {int} 接收数据过程中的读超时时间
495 * @return {int} 0: 成功; < 0: 失败
496 */
498  ACL_VSTREAM *stream, int timeout);
499 
500 /**
501  * 同步获取一个HTTP RESPOND协议头,数据结果存储在hdr中, 当取得一个完整的HTTP头或
502  * 出错时调用用户的注册函数 notify
503  * @param hdr {HTTP_HDR_REQ*} HTTP响应头类型结构指针,不能为空
504  * @param stream {ACL_VSTREAM*} 与服务端连接的数据流, 不能为空
505  * @param timeout {int} 接收数据过程中的读超时时间
506  * @return {int} 0: 成功; < 0: 失败
507  */
509  ACL_VSTREAM *stream, int timeout);
510 
511 /**
512  * 同步从客户端读取请求的BODY协议体
513  * @param request {HTTP_REQ*} HTTP请求体类型指针, 不能为空, 且 request->hdr 为空
514  * @param stream {ACL_VSTREAM*} 与客户端连接的数据流, 不能为空
515  * @param buf {void *} 存储结果的内容空间
516  * @param size {int} buf 的空间大小
517  * @return ret {http_off_t} 本次读到的HTTP请求体的内容
518  * 0: 表示读完了HTTP数据体内容,但并不代表数据流已经关闭;
519  * < 0: 表示读出错,流关闭或出错;
520  * > 0: 表示未读完,目前读到ret 个字节的数据
521  */
523  void *buf, int size);
524 #define http_req_body_get_sync2 http_req_body_get_sync
525 
526 /**
527  * 同步从服务端读取响应的BODY协议体
528  * @param respond {HTTP_RES*} HTTP响应体类型指针, 不能为空, 且 respond->hdr 为空
529  * @param stream {ACL_VSTREAM*} 与客户端连接的数据流, 不能为空
530  * @param buf {void *} 存储结果的内容空间
531  * @param size {int} buf 的空间大小
532  * @return ret {http_off_t} 本次读到的HTTP响应体的内容
533  * 0: 表示读完了HTTP数据体内容,但并不代表数据流已经关闭;
534  * < 0: 表示读出错,流关闭或出错;
535  * > 0: 表示未读完,目前读到ret 个字节的数据
536  */
538  void *buf, int size);
539 #define http_res_body_get_sync2 http_res_body_get_sync
540 
541 /**
542  * 设置请求协议的控制标志位
543  * @param request {HTTP_REQ*} HTTP请求体类型指针, 不能为空, 且 request->hdr 为空
544  * @param name {int} 第一个标志位,当最后一个标志位为 HTTP_CHAT_SYNC_CTL_END 时
545  * 表示结束
546  */
547 HTTP_API void http_chat_sync_reqctl(HTTP_REQ *request, int name, ...);
548 
549 /**
550  * 设置响应协议的控制标志位
551  * @param respond {HTTP_RES*} HTTP响应体类型指针, 不能为空, 且 respond->hdr 为空
552  * @param name {int} 第一个标志位,当最后一个标志位为 HTTP_CHAT_SYNC_CTL_END 时
553  * 表示结束
554  */
555 HTTP_API void http_chat_sync_resctl(HTTP_RES *respond, int name, ...);
556 #define HTTP_CHAT_SYNC_CTL_END 0 /**< 结束标志位 */
557 #define HTTP_CHAT_CTL_BUFF_ONOFF 1 /**< 是否打开数据接收时的预缓冲策略 */
558 
559 /*------------------------ HTTP 请求体构造及释放函数 ------------------------*/
560 /* in http_req.c */
561 
562 /**
563  * 根据HTTP请求头分配一个请求体对象
564  * @param hdr_req {HTTP_HDR_REQ*} 请求头对象
565  * @return {HTTP_REQ*} 请求体对象
566  */
568 
569 /**
570  * 释放请求体对象
571  * @param request {HTTP_REQ*} 请求体对象
572  */
573 HTTP_API void http_req_free(HTTP_REQ *request);
574 
575 /*------------------------ HTTP 响应体构造及释放函数 ------------------------*/
576 /* in http_res.c */
577 
578 /**
579 * 根据HTTP响应头分配一个响应体对象
580 * @param hdr_res {HTTP_HDR_RES*} 响应头对象
581 * @return {HTTP_RES*} 响应体对象
582 */
584 
585 /**
586  * 释放响应体对象
587  * @param respond {HTTP_RES*} 响应体对象
588  */
589 HTTP_API void http_res_free(HTTP_RES *respond);
590 
591 /*------------------------------ HTTP 头构造函数 -----------------------------*/
592 /* in http_hdr_build.c */
593 
594 /**
595  * 向通用HTTP头中添加数据
596  * @param hdr {HTTP_HDR*} 通用HTTP头对象
597  * @param name {const char*} 变量名,如 Accept-Encoding: deflate, gzip 中的 Accept-Encoding
598  * @param value {const char*} 变量值,如 Accept-Encoding: deflate, gzip 中的 deflate, gzip
599  */
600 HTTP_API void http_hdr_put_str(HTTP_HDR *hdr, const char *name, const char *value);
601 
602 /**
603  * 向通用HTTP头中添加数据
604  * @param hdr {HTTP_HDR*} 通用HTTP头对象
605  * @param name {const char*} 变量名,如 Content-Length: 1024 中的 Conteng-Length
606  * @param value {const int} 变量值,如 Content-Length: 1024 中的 1024
607  */
608 HTTP_API void http_hdr_put_int(HTTP_HDR *hdr, const char *name, int value);
609 
610 /**
611  * 向通用HTTP头中添加数据
612  * @param hdr {HTTP_HDR*} 通用HTTP头对象
613  * @param name {const char*} 变量名,如 Accept-Encoding: deflate, gzip 中的 Accept-Encoding
614  * @param fmt {const char*} 变参格式字符串
615  */
616 # if defined(WIN32) || defined(WIN64)
617 HTTP_API void http_hdr_put_fmt(HTTP_HDR *hdr, const char *name, const char *fmt, ...);
618 #else
619 HTTP_API void __attribute__((format(printf,3,4)))
620  http_hdr_put_fmt(HTTP_HDR *hdr, const char *name, const char *fmt, ...);
621 #endif
622 
623 /**
624  * 向通用HTTP头中添加时间数据
625  * @param hdr {HTTP_HDR*} 通用HTTP头对象
626  * @param name {const char*} 变量名
627  * @param t {time_t} 时间值
628  */
629 HTTP_API void http_hdr_put_time(HTTP_HDR *hdr, const char *name, time_t t);
630 
631 /**
632  * 根据HTTP请求头的字段来设置是否与服务端保持长连接, 结果存储于HTTP响应头中
633  * @param req {const HTTP_HDR_REQ*} HTTP请求头
634  * @param res {HTTP_HDR_RES*} HTTP响应头,存储分析结果
635  */
637 
638 /**
639  * 用返回状态(1xx, 2xx, 3xx, 4xx, 5xx) 初始化一个HTTP响应头
640  * @param hdr_res {HTTP_HDR_RES*} HTTP响应头,存储分析结果
641  * @param status {int} 状态号,nxx(1xx, 2xx, 3xx, 4xx, 5xx)
642  */
643 HTTP_API void http_hdr_res_init(HTTP_HDR_RES *hdr_res, int status);
644 
645 /**
646  * 用返回状态(nxx)生成一个HTTP响应头
647  * @param status {int} 状态号,nxx(1xx, 2xx, 3xx, 4xx, 5xx)
648  * @return {HTTP_HDR_RES*} 生成的HTTP响应头
649  */
651 
652 /**
653 * 用返回状态(nxx)生成一个HTTP响应头
654 * @param status {int} 状态号,nxx(4xx, 5xx)
655 * @return {HTTP_HDR_RES*} 生成的HTTP响应头
656 */
658 
659 /**
660  * 根据HTTP通用头生成头的完整内容于BUF中
661  * @param hdr {const HTTP_HDR*} 通用HTTP头
662  * @param strbuf {ACL_VSTRING*} 存储结果的缓冲区
663  */
664 HTTP_API void http_hdr_build(const HTTP_HDR *hdr, ACL_VSTRING *strbuf);
665 
666 /**
667  * 根据HTTP请求头生成请求头内容于BUF中
668  * @param hdr_req {const HTTP_HDR_REQ*} HTTP请求头
669  * @param strbuf {ACL_VSTRING*} 存储结果的缓冲区
670  */
671 HTTP_API void http_hdr_build_request(const HTTP_HDR_REQ *hdr_req, ACL_VSTRING *strbuf);
672 
673 /*----------------------------- HTTP 响应状态信息函数 ------------------------*/
674 /* in http_status.c */
675 
676 /**
677  * 根据HTTP响应号(nxx)返回该值所代表的字符串
678  * @param status {int} 状态号,nxx(1xx, 2xx, 3xx, 4xx, 5xx)
679  * @return {const char*} 响应号所对应的字符串表示
680  */
681 HTTP_API const char *http_status_line(int status);
682 
683 /*---------------------------- HTTP HTML 模板操作函数 ------------------------*/
684 /* in http_tmpl.c */
685 
686 /**
687  * 装载HTTP响应代码的HTML模板
688  * @param tmpl_path {const char*} HTML模板文件所在的路径
689  */
690 HTTP_API void http_tmpl_load(const char *tmpl_path);
691 
692 /**
693  * 读取对应HTTP响应状态码的模板信息
694  * @param status {int} HTTP 状态响应码
695  * @return {const ACL_VSTRING*} 对应HTTP响应状态码的模板信息
696  */
697 HTTP_API const ACL_VSTRING *http_tmpl_get(int status);
698 
699 /**
700  * 读取对应HTTP响应状态码的标题提示信息
701  * @param status {int} HTTP 状态响应码
702  * @return {const char*} 对应HTTP响应状态码的标题提示信息
703  */
704 HTTP_API const char *http_tmpl_title(int status);
705 
706 /**
707  * 获得相应HTTP响应状态码的模板提示信息的长度大小
708  * @param status {int} HTTP 状态响应码
709  * @return {int} 模板提示信息的长度大小
710  */
711 HTTP_API int http_tmpl_size(int status);
712 
713 /*---------------------------- HTTP HTML 模板初始化函数 ----------------------*/
714 /* in http_init.c */
715 
716 /**
717  * 初始化HTTP应用协议
718  * @param tmpl_path {const char*} 模板信息文件的存放路径
719  */
720 HTTP_API void http_init(const char *tmpl_path);
721 
722 /**
723  * 是否自动缓冲被释放的 HTTP 头对象,从而使其内存可以重复使用, 该函数在程序初始化
724  * 时只能被调用一次
725  * @param max {int} 当该值 > 0 时便自动启用 HTTP 头对象缓冲功能
726  */
727 HTTP_API void http_hdr_cache(int max);
728 
729 /**
730  * 设置在进行 HTTP 协议体数据传输时的缓冲区大小
731  * @param size {http_off_t} 缓冲区大小
732  */
734 
735 /**
736  * 获得进行 HTTP 协议体数据传输时的缓冲区大小
737  * @return {http_off_t} 缓冲区大小
738  */
740 
741 #ifdef __cplusplus
742 }
743 #endif
744 
745 #endif
HTTP_API const char * http_status_line(int status)
HTTP_API void http_tmpl_load(const char *tmpl_path)
HTTP_API int http_hdr_parse_version(HTTP_HDR *hh, const char *data)
HTTP_API int http_hdr_res_status_parse(HTTP_HDR_RES *hh, const char *dbuf)
HTTP_API http_off_t http_req_body_get_sync(HTTP_REQ *request, ACL_VSTREAM *stream, void *buf, int size)
int(* HTTP_HDR_NOTIFY)(int status, void *arg)
HTTP_API HTTP_HDR_ENTRY * http_hdr_entry_new2(char *data)
HTTP_API HTTP_HDR_ENTRY * http_hdr_entry_build(const char *name, const char *value)
HTTP_API void http_req_free(HTTP_REQ *request)
HTTP_API void http_hdr_req_get_async(HTTP_HDR_REQ *hdr, ACL_ASTREAM *astream, HTTP_HDR_NOTIFY notify, void *arg, int timeout)
HTTP_API HTTP_HDR_RES * http_hdr_res_error(int status)
HTTP_API void const char * name
Definition: lib_http.h:620
HTTP_API void http_hdr_fprint(ACL_VSTREAM *fp, const HTTP_HDR *hh, const char *msg)
HTTP_API void http_hdr_req_free(HTTP_HDR_REQ *hh)
HTTP_API int http_hdr_res_get_sync(HTTP_HDR_RES *hdr, ACL_VSTREAM *stream, int timeout)
HTTP_API char * http_hdr_entry_value(const HTTP_HDR *hh, const char *name)
HTTP_API const char * http_hdr_req_host(const HTTP_HDR_REQ *hh)
HTTP_API int http_hdr_req_range(const HTTP_HDR_REQ *hdr_req, http_off_t *range_from, http_off_t *range_to)
HTTP_API int http_tmpl_size(int status)
#define HTTP_API
ACL_API ACL_VSTRING const char * format
Definition: acl_vstring.h:239
HTTP_API void http_hdr_free(HTTP_HDR *hh)
HTTP_API int http_hdr_res_parse(HTTP_HDR_RES *hdr_res)
HTTP_API const char * http_hdr_req_url(const HTTP_HDR_REQ *hh)
HTTP_API void http_res_free(HTTP_RES *respond)
HTTP_API void http_hdr_cache(int max)
HTTP_API HTTP_HDR_RES * http_hdr_res_static(int status)
HTTP_API HTTP_HDR_ENTRY * http_hdr_entry_head(char *data)
HTTP_API void http_hdr_put_int(HTTP_HDR *hdr, const char *name, int value)
HTTP_API int http_hdr_req_get_sync(HTTP_HDR_REQ *hdr, ACL_VSTREAM *stream, int timeout)
HTTP_API void http_hdr_build_request(const HTTP_HDR_REQ *hdr_req, ACL_VSTRING *strbuf)
HTTP_API void http_init(const char *tmpl_path)
HTTP_API int http_hdr_req_cookies_parse(HTTP_HDR_REQ *hh)
HTTP_API HTTP_HDR_REQ * http_hdr_req_rewrite(const HTTP_HDR_REQ *hh, const char *url)
HTTP_API const ACL_VSTRING * http_tmpl_get(int status)
HTTP_API int http_hdr_req_parse(HTTP_HDR_REQ *hh)
HTTP_API void http_hdr_print(const HTTP_HDR *hh, const char *msg)
HTTP_API void http_hdr_entry_off(HTTP_HDR *hh, const char *name)
HTTP_API void http_hdr_res_init(HTTP_HDR_RES *hdr_res, int status)
HTTP_API HTTP_HDR_RES * http_hdr_res_clone(const HTTP_HDR_RES *hdr_res)
HTTP_API void const char const char HTTP_API void http_hdr_put_time(HTTP_HDR *hdr, const char *name, time_t t)
HTTP_API void http_hdr_res_free(HTTP_HDR_RES *hh)
HTTP_API int http_hdr_req_line_parse(HTTP_HDR_REQ *hh)
HTTP_API void http_buf_size_set(http_off_t size)
HTTP_API int http_hdr_set_keepalive(const HTTP_HDR_REQ *req, HTTP_HDR_RES *res)
HTTP_API const char * http_hdr_req_method(const HTTP_HDR_REQ *hh)
HTTP_API const char * http_hdr_req_cookie_get(HTTP_HDR_REQ *hh, const char *name)
HTTP_API int http_hdr_res_range(const HTTP_HDR_RES *hdr_res, http_off_t *range_from, http_off_t *range_to, http_off_t *total_length)
HTTP_API void http_hdr_clone(const HTTP_HDR *src, HTTP_HDR *dst)
HTTP_API HTTP_HDR_REQ * http_hdr_req_clone(const HTTP_HDR_REQ *hdr_req)
HTTP_API const char * http_hdr_req_url_path(const HTTP_HDR_REQ *hh)
HTTP_API void http_hdr_res_get_async(HTTP_HDR_RES *hdr, ACL_ASTREAM *astream, HTTP_HDR_NOTIFY notify, void *arg, int timeout)
HTTP_API http_off_t http_res_body_get_sync(HTTP_RES *respond, ACL_VSTREAM *stream, void *buf, int size)
HTTP_API const char * http_mkrfc1123(char *buf, size_t size, time_t t)
HTTP_API void http_hdr_reset(HTTP_HDR *hh)
HTTP_API http_off_t http_buf_size_get(void)
HTTP_API int http_hdr_req_parse3(HTTP_HDR_REQ *hh, int parse_params, int parse_cookie)
HTTP_API HTTP_REQ * http_req_new(HTTP_HDR_REQ *hdr_req)
HTTP_API void http_hdr_put_str(HTTP_HDR *hdr, const char *name, const char *value)
HTTP_API const char * http_tmpl_title(int status)
int(* HTTP_BODY_NOTIFY)(int status, char *data, int dlen, void *arg)
HTTP_API void http_hdr_sprint(ACL_VSTRING *bf, const HTTP_HDR *hh, const char *msg)
HTTP_API void http_hdr_append_entry(HTTP_HDR *hh, HTTP_HDR_ENTRY *entry)
HTTP_API int http_hdr_req_rewrite2(HTTP_HDR_REQ *hh, const char *url)
HTTP_API HTTP_HDR_REQ * http_hdr_req_new(void)
HTTP_API HTTP_HDR_ENTRY * http_hdr_entry_new(const char *data)
HTTP_API void http_req_body_get_async(HTTP_REQ *request, ACL_ASTREAM *astream, HTTP_BODY_NOTIFY notify, void *arg, int timeout)
HTTP_API HTTP_HDR_RES * http_hdr_res_new(void)
HTTP_API HTTP_HDR * http_hdr_new(size_t size)
HTTP_API int http_hdr_entry_replace2(HTTP_HDR *hh, const char *name, const char *from, const char *to, int ignore_case)
HTTP_API const char * http_hdr_req_url_part(const HTTP_HDR_REQ *hh)
acl_int64 http_off_t
HTTP_API void http_hdr_req_reset(HTTP_HDR_REQ *hh)
HTTP_API int http_hdr_entry_replace(HTTP_HDR *hh, const char *name, const char *value, int force)
HTTP_API void __attribute__((format(printf, 3, 4))) http_hdr_put_fmt(HTTP_HDR *hdr
HTTP_API void http_chat_sync_resctl(HTTP_RES *respond, int name,...)
HTTP_API void http_uri_correct(int onoff)
HTTP_API void http_chat_sync_reqctl(HTTP_REQ *request, int name,...)
HTTP_API int http_hdr_parse(HTTP_HDR *hh)
HTTP_API void http_hdr_build(const HTTP_HDR *hdr, ACL_VSTRING *strbuf)
HTTP_API const char * http_hdr_req_param(const HTTP_HDR_REQ *hh, const char *name)
HTTP_API void http_hdr_res_reset(HTTP_HDR_RES *hh)
HTTP_API HTTP_HDR_REQ * http_hdr_req_create(const char *url, const char *method, const char *version)
HTTP_API HTTP_HDR_ENTRY * http_hdr_entry(const HTTP_HDR *hh, const char *name)
HTTP_API void const char const char * fmt
Definition: lib_http.h:620
HTTP_API HTTP_RES * http_res_new(HTTP_HDR_RES *hdr_res)
HTTP_API void http_res_body_get_async(HTTP_RES *respond, ACL_ASTREAM *astream, HTTP_BODY_NOTIFY notify, void *arg, int timeout)