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
*/
13
class
ACL_CPP_API
http_service_request
:
public
http_header
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
92
class
ACL_CPP_API
http_service
:
public
ipc_service
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
http_header.hpp
acl::http_header
Definition:
http_header.hpp:19
acl::http_service_request::destroy
virtual void destroy(void)
Definition:
http_service.hpp:42
HTTP_HDR_RES
Definition:
lib_http_struct.h:180
acl
Definition:
acl_cpp_init.hpp:4
acl::http_status_t
http_status_t
Definition:
http_type.hpp:12
acl::http_service
Definition:
http_service.hpp:92
acl::aio_handle_type
aio_handle_type
Definition:
aio_handle.hpp:13
acl::ipc_service
Definition:
ipc_service.hpp:56
acl::http_service_request
Definition:
http_service.hpp:13
acl::aio_socket_stream
Definition:
aio_socket_stream.hpp:40
ACL_CPP_API
#define ACL_CPP_API
Definition:
acl_cpp_define.hpp:16
include
acl_cpp
http
http_service.hpp
生成于 2021年 九月 10日 星期五 11:14:44 , 为 acl使用
1.8.15