acl  3.5.3.0
lib_http_struct.h
浏览该文件的文档.
1 
2 #ifndef __LIB_HTTP_STRUCT_INCLUDE_H__
3 #define __LIB_HTTP_STRUCT_INCLUDE_H__
4 
5 /* #include "lib_acl.h" */
6 
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 
11 #ifdef HTTP_LIB
12 # ifndef HTTP_API
13 # define HTTP_API
14 # endif
15 #elif defined(HTTP_DLL) // || defined(_WINDLL)
16 # if defined(HTTP_EXPORTS) || defined(protocol_EXPORTS)
17 # ifndef HTTP_API
18 # define HTTP_API __declspec(dllexport)
19 # endif
20 # elif !defined(HTTP_API)
21 # define HTTP_API __declspec(dllimport)
22 # endif
23 #elif !defined(HTTP_API)
24 # define HTTP_API
25 #endif
26 
27 typedef acl_int64 http_off_t;
28 
29 /* 结构类型定义 */
30 typedef struct HTTP_HDR HTTP_HDR;
31 typedef struct HTTP_HDR_REQ HTTP_HDR_REQ;
32 typedef struct HTTP_HDR_RES HTTP_HDR_RES;
33 typedef struct HTTP_REQ HTTP_REQ;
34 typedef struct HTTP_RES HTTP_RES;
36 
37 /* 函数类型定义 */
38 
39 /**
40  * 数据头过程中的回回调函数类型定义
41  * @param status {int} HTTP_CHAT_XXX
42  * status:
43  * HTTP_CHAT_OK: 读到完整的数据头
44  * HTTP_CHAT_ERR_TOO_MANY_LINES: 数据头中的行数太多
45  * @param arg {void*} 回调函数的参数
46  * @return {int} 该回调函数如果返回值为 -1 则上级调用者便结束; 若返回 0
47  * 上级调用者继续
48  */
49 typedef int (*HTTP_HDR_NOTIFY)(int status, void *arg);
50 
51 /**
52  * 数据体请求过程中的回调函数类型定义
53  * @param status {int} HTTP_CHAT_XXX
54  * status:
55  * HTTP_CHAT_OK: 已经读完整个数据体,且 data 代表最后一部分数据, dlen 表示
56  * data 的数据长度
57  * HTTP_CHAT_DATA: 当为块传输方式时,表示每个数据块中的数据体中的部分数据;
58  * 当非块传输方式时,表示整个数据体的一部分数据
59  * HTTP_CHAT_CHUNK_HDR: 表示块传输方式中的某个数据块的头数据
60  * HTTP_CHAT_CHUNK_TRAILER: 表示块传输方式中的最后一个数据块的头数据
61  * HTTP_CHAT_CHUNK_DATA_ENDL: 表示块传输方式中每块数据中最后的分隔行数据
62  * HTTP_CHAT_ERR_PROTO: 表示协议出错
63  * @param data {char *} 所读到的数据开始地址,永远不为空
64  * @param dlen {int} 表示当前 data 数据长度
65  * @return {int} 该回调函数如果返回值为 -1 则上级调用者便结束; 若返回 0
66  * 上级调用者继续
67  */
68 typedef int (*HTTP_BODY_NOTIFY)(int status, char *data, int dlen, void *arg);
69 
70 /* 通信过程状态字定义 */
71 #define HTTP_CHAT_OK 0 /**< 读完了整个数据 */
72 #define HTTP_CHAT_CONTINUE 1 /**< 内部用 */
73 #define HTTP_CHAT_DATA 2 /**< 数据体中的部分数据 */
74 #define HTTP_CHAT_CHUNK_HDR 3 /**< 块数据头中的数据 */
75 #define HTTP_CHAT_CHUNK_DATA_ENDL 4 /**< 块数据体中的分隔行数据 */
76 #define HTTP_CHAT_CHUNK_TRAILER 5 /**< 最后一个数据块的头部分数据 */
77 #define HTTP_CHAT_ERR_MIN 100 /**< 做为错误值的最小值 */
78 #define HTTP_CHAT_ERR_IO 101 /**< IO出错 */
79 #define HTTP_CHAT_ERR_PROTO 102 /**< 请求数据或响应数据的协议出错 */
80 #define HTTP_CHAT_ERR_TOO_MANY_LINES 103 /**< 数据头太多行 */
81 #define HTTP_CHAT_ERR_MAX 1000 /**< 最大错误范围 */
82 
83 /* 设置的标志位 */
84 #define HTTP_CHAT_FLAG_BUFFED 0x0001
85 
86 /* HTTP 协议头部字段的定义 */
87 #define HTTP_HDR_ENTRY_VIA "via" /**< HTTP 头添加字段,防止递归请求 */
88 #define HTTP_HDR_ENTRY_FORWARD_FOR "X-Forwarded-For" /**< HTTP 请求头添加字段 */
89 
90 /* HTTP 协议请求结构 */
91 struct HTTP_REQ {
92  HTTP_HDR_REQ *hdr_req; /**< 与 client 相关 */
93  int status; /**< 是否出错, defined above: HTTP_STATUS_ */
94  unsigned int flag; /**< defined as: HTTP_CHAT_FLAG_XXX */
95  void *ctx;
96  void (*free_ctx)(void*);
97 };
98 
99 struct HTTP_RES {
100  HTTP_HDR_RES *hdr_res; /**< 与 client 相关 */
101  int read_cnt;
102  int status; /**< 是否出错, defined above: HTTP_STATUS_ */
103  unsigned int flag; /**< defined as: HTTP_CHAT_FLAG_XXX */
104  void *ctx;
105  void (*free_ctx)(void*);
106 };
107 
108 /* name-value 格式的条目 */
110  char *name;
111  char *value;
112  int off;
113 };
114 
115 /* HTTP 协议头 */
116 
117 struct HTTP_HDR {
118  /* 通用实体 */
119  char proto[8]; /**< 支持的协议: HTTP */
120  struct {
121  unsigned int major; /**< 主版本号 */
122  unsigned int minor; /**< 次版本号 */
123  } version;
124 
125  http_off_t content_length; /**< HTTP协议体数据长度 */
126 
127  /**< 是否保持长连接: 0 -> 不保持,> 0 -> 保持,< 0 -> 没有该字段 */
129  char chunked; /* 该字段本来对HTTP协议响应有意义, 为了将来的扩展, 故定义于此 */
130 
131  /* 内部变量 */
132  short cur_lines;
133  short max_lines;
134  short valid_lines;
135  short status;
136  short keep_alive_count; /**< 处理次数 */
137 
138  ACL_ARRAY *entry_lnk; /**< 存储着 HTTP_HDR_ENTRY 类型的元素 */
139  void *chat_ctx;
140  void (*chat_free_ctx_fn)(void*);
141 
142  char debug; /**< 调试信息头的标志位 */
143 };
144 
145 #define HDR_RESTORE(hdr_ptr, hdr_type, hdr_member) \
146  ((hdr_type *) (((char *) (hdr_ptr)) - offsetof(hdr_type, hdr_member)))
147 
148 /* HTTP 请求头 */
149 struct HTTP_HDR_REQ {
150  HTTP_HDR hdr; /**< 包裹了通用的HDR头, 便于通用分析 */
151 
152  int port; /**< 所请求的服务端的服务端口号 */
153  /* 请求实体 */
154  char method[32]; /**< 请求方法: POST, GET, CONNECT */
155  char host[512]; /**< 所请示的主机的域名或IP地址 */
157  * 存储着请求行 URL 中的后半部分,
158  * 如:
159  * 1) http://test.com.cn/cgi-bin/test?name=value
160  * => /cgi-bin/test?name=value
161  */
163  * 存储着请求行 URL 中的相对路径发(不包含主机部分),
164  * 如对于 /path/test.cgi?name=value,
165  * 仅存储 /path/test.cgi, 剩余的
166  * 参数部分则由 url_params 存储.
167  */
168  ACL_VSTRING *url_params; /**< 存储着 URL 中的参数部分 */
170 
171  ACL_HTABLE *params_table; /**< 存储着 URL 请求行的各个字段的数据 */
172  ACL_HTABLE *cookies_table; /**< 存储着的 cookie 项 */
173  unsigned int flag; /**< 标志位 */
174 #define HTTP_HDR_REQ_FLAG_PARSE_PARAMS (1 << 0)
175 #define HTTP_HDR_REQ_FLAG_PARSE_COOKIE (1 << 1)
176 };
177 
178 /* HTTP 响应头 */
179 
180 struct HTTP_HDR_RES {
181  HTTP_HDR hdr; /**< 包裹了通用的HDR头, 便于通用分析 */
182 
183  /* 响应实体 */
184  int reply_status; /**< 服务器的响应代码,如: 100, 200, 404, 304, 500 */
185 };
186 
187 #ifdef __cplusplus
188 }
189 #endif
190 
191 #endif
192 
int(* HTTP_HDR_NOTIFY)(int status, void *arg)
ACL_VSTRING * url_path
ACL_VSTRING * file_path
short valid_lines
ACL_HTABLE * cookies_table
unsigned int flag
unsigned int flag
short max_lines
ACL_VSTRING * url_params
void(* chat_free_ctx_fn)(void *)
HTTP_HDR_REQ * hdr_req
ACL_HTABLE * params_table
struct HTTP_HDR::@17 version
HTTP_HDR_RES * hdr_res
short keep_alive_count
int(* HTTP_BODY_NOTIFY)(int status, char *data, int dlen, void *arg)
ACL_VSTRING * url_part
unsigned int minor
unsigned int major
void * chat_ctx
void(* free_ctx)(void *)
void(* free_ctx)(void *)
short cur_lines
acl_int64 http_off_t
ACL_ARRAY * entry_lnk
unsigned int flag
char proto[8]
void * ctx
char host[512]
http_off_t content_length