acl  3.5.3.0
http_service.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../stream/aio_handle.hpp"
3 #include "../ipc/ipc_service.hpp"
4 #include "http_header.hpp"
5 
6 namespace acl {
7 
8 class string;
9 
10 /**
11  * HTTP 服务请求类,子类必须继承该类
12  */
14 {
15 public:
16  /**
17  * 构造函数
18  * @param domain {const char*} HTTP 服务器的域名(也可以是IP),非空
19  * 如果传入了空值,则会 fatal
20  * @param port {unsigned short} HTTP 服务端口
21  */
22  http_service_request(const char* domain, unsigned short port);
23 
24  /**
25  * 获得由构造函数输入的 domain
26  * @return {const char*} 永不为空
27  */
28  const char* get_domain(void) const;
29 
30  /**
31  * 获得由构造函数输入的 port
32  * @return {unsigned short}
33  */
34  unsigned short get_port(void) const;
35 
36  /**
37  * 当任务处理完毕或出错时,内部处理过程会自动调用 destroy 接口,
38  * 子类可以在该接口内进行一些释放过程,尤其当该对象是动态创建时,
39  * 子类应该在该函数内 delete this 以删除自己,因为该函数最终肯定
40  * 会被调用,所以子类不应在其它地方进行析构操作
41  */
42  virtual void destroy(void) {}
43 
44  //////////////////////////////////////////////////////////////////////
45  // 子类必须实现如此虚接口
46 
47  /**
48  * 获得 HTTP 请求体数据,该函数会在请求过程中被循环调用,直到返回的数据
49  * 对象中的数据为空
50  * @return {const string*} 请求体结果数据,如果返回空指针或返回的缓冲区
51  * 对象的数据为空(即 string->empty()) 则表示 HTTP 请求体数据结束
52  * 注意:与其它函数不同,该虚接口是另外的子线程中被调用的,所以如果子类
53  * 实现了该接口,如果需要调用与原有线程具备竞争的资源时应该注意加锁保护
54  */
55  virtual const string* get_body(void);
56 
57  /**
58  * 当获得 HTTP 服务器的 HTTP 响应头时的回调接口
59  * @param addr {const char*} 与服务器之间的连接地址,格式:IP:PORT
60  * @param hdr {const HTTP_HDR_RES*} HTTP 响应头,该结构定义参见:
61  * acl_project/lib_protocol/include/http/lib_http_struct.h
62  */
63  virtual void on_hdr(const char* addr, const HTTP_HDR_RES* hdr) = 0;
64 
65  /**
66  * 当获得 HTTP 服务器的 HTTP 响应体时的回调接口,当 HTTP 响应体数据
67  * 比较大时,该回调会被多次调用,直到出错(会调用 on_error)或数据读完
68  * 时,该回调的两个参数均 0,当 data 及 dlen 均为 0 时,表明读 HTTP
69  * 响应体结束
70  * @param data {const char*} 某次读操作时 HTTP 响应体数据
71  * @param dlen {size_t} 某次读操作时 HTTP 响应体数据长度
72  * 注:如果 HTTP 响应只有头数据而没有数据体,则也会调用该函数通知用户
73  * HTTP 会话结束
74  */
75  virtual void on_body(const char* data, size_t dlen) = 0;
76 
77  /**
78  * 在 HTTP 请求或响应过程中如果出错,则会调用此接口,通知子类出错,
79  * 在调用此接口后
80  * @param errnum {http_status_t} 出错码
81  */
82  virtual void on_error(http_status_t errnum) = 0;
83 protected:
84  virtual ~http_service_request(void);
85 private:
86  char* domain_;
87  unsigned short port_;
88 };
89 
90 class aio_socket_stream;
91 
93 {
94 public:
95  /**
96  * 构造函数
97  * @param nthread {int} 如果该值 > 1 则内部自动采用线程池,否则
98  * 则是一个请求一个线程
99  * @param nwait {int} 当异步引擎采用 ENGINE_WINMSG 时,为了避免
100  * 因任务线程发送的数据消息过快而阻塞了主线程的 _WIN32 消息循环,
101  * 在任务线程发送数据消息时自动休眠的毫秒数;对于其它异步引擎,
102  * 该值也可以用于限速功能
103  * @param win32_gui {bool} 是否是窗口类的消息,如果是,则内部的
104  * 通讯模式自动设置为基于 _WIN32 的消息,否则依然采用通用的套接
105  * 口通讯方式
106  */
107  http_service(int nthread = 1, int nwait = 1, bool win32_gui = false);
108  ~http_service(void);
109 
110  /**
111  * 应用调用此函数开始 HTTP 会话过程,由 http_service 类对象负责
112  * 向服务器异步发出 HTTP 请求,同时异步读取来自于 HTTP 服务器的响应
113  * @param req {http_service_request*} HTTP 请求类对象
114  */
115  void do_request(http_service_request* req);
116 protected:
117 #if defined(_WIN32) || defined(_WIN64)
118  /**
119  * 基类虚函数,当收到来自于子线程的 win32 消息时的回调函数
120  * @param hWnd {HWND} 窗口句柄
121  * @param msg {UINT} 用户自定义消息号
122  * @param wParam {WPARAM} 参数
123  * @param lParam {LPARAM} 参数
124  */
125  virtual void win32_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
126 #endif
127  /**
128  * 基类虚函数,当有新连接到达时基类回调此函数
129  * @param client {aio_socket_stream*} 接收到的新的客户端连接
130  */
131  virtual void on_accept(aio_socket_stream* client);
132 
133  /**
134  * 基类虚函数,当监听流成功打开后的回调函数
135  * @param addr {const char*} 实际的监听地址,格式:IP:PORT
136  */
137  virtual void on_open(const char*addr);
138 
139  /**
140  * 基类虚函数,当监听流关闭时的回调函数
141  */
142  virtual void on_close(void);
143 private:
144  char* addr_;
145  int nwait_;
146  aio_handle_type handle_type_;
147 };
148 
149 } // namespace acl
virtual void destroy(void)
http_status_t
Definition: http_type.hpp:12
aio_handle_type
Definition: aio_handle.hpp:13
#define ACL_CPP_API