acl  3.5.3.0
http_response.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "../stdlib/noncopyable.hpp"
4 #include "http_header.hpp"
5 
6 namespace acl {
7 
8 class http_client;
9 class http_pipe;
10 class socket_stream;
11 class xml;
12 class json;
13 
15 {
16 public:
17  /**
18  * 构造函数:通过该构造函数传入的 socket_stream 流对象并
19  * 不会被关闭,需要调用者自己关闭
20  * @param client {socket_stream*} 数据连接流,非空
21  * 注:该类实例在长连接时可以被多次使用,但一定得注意使用
22  * 顺序:get_body->response
23  */
25  virtual ~http_response(void);
26 
27  //////////////////////////////////////////////////////////////////////
28  // 与读取请求数据相关的方法
29 
30  /**
31  * 读取 HTTP 请求客户端的 HTTP 请求头,在调用本方法后才可以调用
32  * get_body/read_body 读取 HTTP 请求体数据
33  * @return {bool} 是否成功
34  */
35  bool read_header();
36 
37  /**
38  * 读取 xml 格式的 HTTP 请求数据体,调用完此函数后应该调用
39  * response 给客户端返回响应数据;该函数每次被调用时,内部的
40  * 对象会被初始化,所以该函数可以在多个会话中被多次调用
41  * @param out {xml&} 将 HTTP 请求体数据存储于该 xml 对象中
42  * @param to_charset {const char*} 当该项非空,内部自动
43  * 将数据转成该字符集存储于 xml 对象中
44  * @return {bool} 是否正常
45  * 注:必须首先调用 read_header 后才能调用本函数
46  * 当请求数据体特别大时不应用此函数,以免内存耗光
47  */
48  bool get_body(xml& out, const char* to_charset = NULL);
49 
50  /**
51  * 读取 json 格式的 HTTP 请求数据体,调用完此函数后应该调用
52  * response 给客户端返回响应数据;该函数每次被调用时,内部的
53  * 对象会被初始化,所以该函数可以在多个会话中被多次调用
54  * @param out {json&} 将 HTTP 请求体数据存储于该 json 对象中
55  * @param to_charset {const char*} 当该项非空,内部自动
56  * 将数据转成该字符集存储于 json 对象中
57  * @return {bool} 是否正常
58  * 注:必须首先调用 read_header 后才能调用本函数
59  * 当请求数据体特别大时不应用此函数,以免内存耗光
60  */
61  bool get_body(json& out, const char* to_charset = NULL);
62 
63  /**
64  * 读取 HTTP 全部请求体数据并存储于输入的缓冲区中
65  * @param out {string&} 存储请求数据体
66  * @param to_charset {const char*} 当该项非空,内部自动
67  * 将数据转成该字符集存储于 out 对象中
68  * 注:当请求数据体特别大时不应用此函数,以免内存耗光
69  * 必须首先调用 read_header 后才能调用本函数
70  */
71  bool get_body(string& out, const char* to_charset = NULL);
72 
73  /**
74  * 读取 HTTP 请求体数据并存储于输入的缓冲区中,可以循环
75  * 调用本函数,直至数据读完了,
76  * @param buf {char*} 存储部分请求体数据
77  * @param size {size_t} buf 缓冲区大小
78  * @return {int} 返回值 == 0 表示正常读完毕,< 0 表示客户端
79  * 关闭连接,> 0 表示已经读到的数据,用户应该一直读数据直到
80  * 返回值 <= 0 为止
81  * 注:该函数读到的是原始 HTTP 数据体数据,不做解压和字符集
82  * 解码,用户自己根据需要进行处理;必须首先调用 read_header
83  * 后才能调用本函数
84  */
85  int read_body(char* buf, size_t size);
86 
87  //////////////////////////////////////////////////////////////////////
88  // 与数据响应相关的方法函数
89 
90  /**
91  * 获得 HTTP 响应头对象,然后在返回的 HTTP 响应头对象中添加
92  * 自己的响应头字段或 http_header::reset()重置响应头状态,
93  * 参考:http_header 类
94  * @return {http_header&}
95  */
96  http_header& response_header(void);
97 
98  /**
99  * 向客户端发送 HTTP 响应数据,可以循环调用此函数;
100  * <b>在调用本函数前,必须提前保证以下操作:</b>
101  * 1)必须先调用 read_header && get_body 获得 HTTP 客户端的请求数据;
102  * 2)必须通过 response_header 取得 http_header 对象,同时设置响应头部
103  * 字段(如:set_status, set_keep_alive 等)
104  * <b>在调用本函数时,以下操作将会发生:</b>
105  * 1)内部会自动在第一次写时发送 HTTP 响应头;
106  * 2)当通过 http_header::set_chunked 设置了 chunked 传输方式后,
107  * 内部自动采用 chunked 传输方式;
108  * 3)在使用 chunked 方式传输数据时,应该最后再调用一次本函数,
109  * 且参数均设为 0 表示数据结束
110  * @param data {const void*} 数据地址
111  * @param len {size_t} data 数据长度
112  * @return {bool} 发送是否成功,如果返回 false 表示连接中断
113  */
114  bool response(const void* data, size_t len);
115 
116  //////////////////////////////////////////////////////////////////////
117 
118  /**
119  * 获得 http_client HTTP 连接流,可以通过返回的对象获得
120  * 客户端请求头的部分数据,参考:http_client 类
121  * @return {http_client*} 当返回空时表示流出错了
122  */
123  http_client* get_client(void) const;
124 
125  /**
126  * 关闭 HTTP 连接流
127  */
128  void close(void);
129 
130 private:
131  bool debug_;
132  bool header_ok_;
133  http_client* client_;
134  http_header header_;
135  bool head_sent_;
136  http_pipe* get_pipe(const char* to_charset);
137 };
138 
139 } // namespace acl
#define ACL_CPP_API