acl  3.5.3.0
HttpServlet.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "../stdlib/noncopyable.hpp"
4 #include "http_header.hpp"
5 
6 #ifndef ACL_CLIENT_ONLY
7 
8 namespace acl {
9 
10 class session;
11 class socket_stream;
12 class HttpServletRequest;
13 class HttpServletResponse;
14 
15 /**
16  * 处理 HTTP 客户端请求的基类,子类需要继承该类
17  */
19 {
20 public:
21  /**
22  * 构造函数
23  * @param stream {socket_stream*} 当在 acl_master 服务器框架控制下
24  * 运行时,该参数必须非空;当在 apache 下以 CGI 方式运行时,该参数
25  * 设为 NULL;另外,该函数内部不会关闭流连接,应用应自行处理流对象
26  * 的关闭情况,这样可以方便与 acl_master 架构结合
27  * @param session {session*} 每一个 HttpServlet 对象一个 session 对象
28  */
30 
31  /**
32  * 构造函数
33  * @param stream {socket_stream*} 当在 acl_master 服务器框架控制下
34  * 运行时,该参数必须非空;当在 apache 下以 CGI 方式运行时,该参数
35  * 设为 NULL;另外,该函数内部不会关闭流连接,应用应自行处理流对象
36  * 的关闭情况,这样可以方便与 acl_master 架构结合
37  * @param memcache_addr {const char*}
38  */
40  const char* memcache_addr = "127.0.0.1|11211");
41 
42  HttpServlet(void);
43  virtual ~HttpServlet(void) = 0;
44 
45  session& getSession(void) const
46  {
47  return *session_;
48  }
49 
50  socket_stream* getStream(void) const
51  {
52  return stream_;
53  }
54 
55  /**
56  * 设置本地字符集,如果设置了本地字符集,则在接收 HTTP 请求数据时,会
57  * 自动将请求的字符集转为本地字符集;该函数必须在 doRun 之前调用才有效
58  * @param charset {const char*} 本地字符集,如果该指针为空,
59  * 则清除本地字符集
60  * @return {HttpServlet&}
61  */
62  HttpServlet& setLocalCharset(const char* charset);
63 
64  /**
65  * 设置 HTTP 会话过程 IO 读写超时时间;该函数必须在 doRun 前调用才有效
66  * @param rw_timeout {int} 读写超时时间(秒)
67  * @return {HttpServlet&}
68  */
69  HttpServlet& setRwTimeout(int rw_timeout);
70 
71  /**
72  * 针对 POST 方法,该方法设置是否需要解析数据体数据,默认为解析,该函
73  * 数必须在 doRun 之前调用才有效;当数据体为数据流或 MIME 格式,即使
74  * 调用本方法设置了解析数据,也不会对数据体进行解析
75  * @param on {bool} 是否需要解析
76  * @return {HttpServlet&}
77  * xxxx: 该方法已经被废弃!
78  */
79  HttpServlet& setParseBody(bool on);
80 
81  /**
82  * 针对 POST 方法,该方法设置解析数据体的最大长度,如果数据体,该函数
83  * 必须在 doRun 之前调用才有效
84  * @param length {int} 最大长度限制,如果请求的数据体长度过大,则直接
85  * 返回 false,如果该值 <= 0 则内部不限制数据体长度,调用该函数前
86  * 内部缺省值为 0
87  * @return {HttpServlet&}
88  */
89  HttpServlet& setParseBodyLimit(int length);
90 
91  /**
92  * HttpServlet 对象开始运行,接收 HTTP 请求,并回调以下 doXXX 虚函数,
93  * @return {bool} 返回处理结果,返回 false 表示处理失败,则应关闭连接,
94  * 返回 true 表示处理成功,调用此函数后应该继续通过判断请求/响应对象中
95  * 是否需要保持长连接来确实最终是否保持长连接
96  */
97  bool start(void);
98 
99  /**
100  * HttpServlet 对象开始运行,接收 HTTP 请求,并回调以下 doXXX 虚函数,
101  * 该函数首先会调用 start 过程,然后根据 start 的返回结果及请求/响应
102  * 对象是否要求保持长连接来决定是否需要与客户端保持长连接
103  * @return {bool} 返回处理结果,返回 false 表示处理失败或处理成功且不保持
104  * 长连接,应关闭连接
105  */
106  virtual bool doRun(void);
107 
108  /**
109  * HttpServlet 对象开始运行,接收 HTTP 请求,并回调以下 doXXX 虚函数
110  * @param session {session&} 存储 session 数据的对象
111  * @param stream {socket_stream*} 当在 acl_master 服务器框架控制下
112  * 运行时,该参数必须非空;当在 apache 下以 CGI 方式运行时,该参数
113  * 设为 NULL;另外,该函数内部不会关闭流连接,应用应自行处理流对象
114  * 的关闭情况,这样可以方便与 acl_master 架构结合
115  * @return {bool} 返回处理结果
116  */
117  virtual bool doRun(session& session, socket_stream* stream = NULL);
118 
119  /**
120  * HttpServlet 对象开始运行,接收 HTTP 请求,并回调以下 doXXX 虚函数,
121  * 调用本函数意味着采用 memcached 来存储 session 数据
122  * @param memcached_addr {const char*} memcached 服务器地址,格式:IP:PORT
123  * @param stream {socket_stream*} 含义同上
124  * @return {bool} 返回处理结果
125  */
126  virtual bool doRun(const char* memcached_addr, socket_stream* stream);
127 
128 protected:
129  /**
130  * 当 HTTP 请求为 GET 方式时调用的虚函数
131  */
132  virtual bool doGet(HttpServletRequest&, HttpServletResponse&);
133 
134  /**
135  * 当 HTTP 请求为 websocket 方式时调用的虚函数
136  */
137  virtual bool doWebSocket(HttpServletRequest&, HttpServletResponse&);
138 
139  /**
140  * 当 HTTP 请求为 POST 方式时调用的虚函数
141  */
142  virtual bool doPost(HttpServletRequest&, HttpServletResponse&);
143 
144  /**
145  * 当 HTTP 请求为 PUT 方式时调用的虚函数
146  */
147  virtual bool doPut(HttpServletRequest&, HttpServletResponse&);
148 
149  /**
150  * 当 HTTP 请求为 PATCH 方式时调用的虚函数
151  */
152  virtual bool doPatch(HttpServletRequest&, HttpServletResponse&);
153 
154  /**
155  * 当 HTTP 请求为 CONNECT 方式时调用的虚函数
156  */
157  virtual bool doConnect(HttpServletRequest&, HttpServletResponse&);
158 
159  /**
160  * 当 HTTP 请求为 PURGE 方式时调用的虚函数,该方法在清除 SQUID 的缓存
161  * 时会用到
162  */
163  virtual bool doPurge(HttpServletRequest&, HttpServletResponse&);
164 
165  /**
166  * 当 HTTP 请求为 DELETE 方式时调用的虚函数
167  */
168  virtual bool doDelete(HttpServletRequest&, HttpServletResponse&);
169 
170  /**
171  * 当 HTTP 请求为 HEAD 方式时调用的虚函数
172  */
173  virtual bool doHead(HttpServletRequest&, HttpServletResponse&);
174 
175  /**
176  * 当 HTTP 请求为 OPTION 方式时调用的虚函数
177  */
178  virtual bool doOptions(HttpServletRequest&, HttpServletResponse&);
179 
180  /**
181  * 当 HTTP 请求为 PROPFIND 方式时调用的虚函数
182  */
183  virtual bool doPropfind(HttpServletRequest&, HttpServletResponse&);
184 
185  /**
186  * 当 HTTP 请求方法未知时调用的虚函数
187  * @param method {const char*} 其它未知的请求方法
188  */
189  virtual bool doOther(HttpServletRequest&, HttpServletResponse&,
190  const char* method);
191 
192  /**
193  * 当 HTTP 请求方法未知时调用的虚函数
194  */
195  virtual bool doUnknown(HttpServletRequest&, HttpServletResponse&);
196 
197  /**
198  * 当 HTTP 请求出错时调用的虚函数
199  */
200  virtual bool doError(HttpServletRequest&, HttpServletResponse&);
201 
202 protected:
205 
206 private:
207  session* session_;
208  session* session_ptr_;
209  socket_stream* stream_;
210  bool first_;
211  char local_charset_[32];
212  int rw_timeout_;
213  int parse_body_limit_;
214 
215  void init();
216 };
217 
218 } // namespace acl
219 
220 #endif // ACL_CLIENT_ONLY
HttpServletRequest * req_
socket_stream * getStream(void) const
Definition: HttpServlet.hpp:50
session & getSession(void) const
Definition: HttpServlet.hpp:45
HttpServletResponse * res_
#define ACL_CPP_API