2.4 KiB
2.4 KiB
1. httpserver组件库
使用/external/httpserver.h-master/src/CMakeLists.txt文件编译的开源库,二次封装接口给到应用层使用。
1.1. 注意事项
- 编译libhttpsrv时,可能会提示 ragel 工具未安装,需要安装 ragel 工具:
$ sudo apt install ragel
- 对开源库的CMakeLists.txt文件增加拷贝命令:
message("${PLATFORM_PATH}/cmake-shell/external${SUBMODULE_PATH_OF_IPC_SDK}/httpserver.h-master/src/libhttpsrv.a")
add_custom_command(
TARGET httpsrv
POST_BUILD
COMMAND cp ${PLATFORM_PATH}/cmake-shell${SUBMODULE_PATH_OF_IPC_SDK}/external/httpserver.h-master/src/libhttpsrv.a ${EXTERNAL_LIBS_OUTPUT_PATH}
WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/
)
- 取消开源库的CMakeLists.txt文件debug配置,未知会产生什么不良后果;
PUBLIC $<$<CONFIG:DEBUG>:-fsanitize=address -fsanitize=undefined -fno-sanitize-recover=all>
- 由于开源代码不支持安全退出,所以修改了开源代码;
int gHttpServerRuning = 1; // 增加一个运行标识
int hs_server_run_event_loop(http_server_t *serv, const char *ipaddr) {
hs_server_listen_on_addr(serv, ipaddr);
struct epoll_event ev_list[1];
while (gHttpServerRuning) { // 运行标识赋值为0时,httpserver退出
int nev = epoll_wait(serv->loop, ev_list, 1, -1);
for (int i = 0; i < nev; i++) {
ev_cb_t *ev_cb = (ev_cb_t *)ev_list[i].data.ptr;
ev_cb->handler(&ev_list[i]);
}
}
return 0;
}
- 修复一个内存安全漏洞;
void _hs_accept_and_begin_request_cycle(http_server_t *server,
hs_io_cb_t on_client_connection_cb,
hs_io_cb_t on_timer_event_cb) {
http_request_t *request = NULL;
while ((request = hs_server_accept_connection(server, on_client_connection_cb,
on_timer_event_cb))) {
if (server->memused > HTTP_MAX_TOTAL_EST_MEM_USAGE) {
hs_request_respond_error(request, 503, "Service Unavailable",
hs_request_begin_write);
} else {
hs_request_begin_read(request);
}
// ================ added by xiao ================ //
if (request) {
hs_request_terminate_connection(request); // 此处应该释放内存
}
// ================ added by xiao end ================ //
}
}