企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
libevent库中包含了http的组件API,我们可以基于这些API实现http的server,API的头文件主要在 libevent-2.1.12-stable/include/event2/http.h 中。 ### httpd是我们基于libevent针对http封装出来的类,将其中API调用的细节进行了统一处理,因此借助httpd可以非常容易搭建出http(s)服务器出来,主要接口如下: ![](https://img.kancloud.cn/47/e7/47e7db67b7d46a0c6c4dd64aa4955f40_832x282.png) ### 两个构造函数,第一个是搭建http服务器,第二个需要证书和私钥用于搭建https服务器;参数需要给ev\_proxy的对象指针还有port,port是网络端口。收到数据后会回调on\_request给上层应用,上层应用处理完需要调用on\_response进行响应。 ### 首先我们看看如何基于httpd构建一个https服务器: ![](https://img.kancloud.cn/7f/60/7f602cdcd7dd29e782d6caea942070f5_832x562.png =700x) ### 非常简单,定义一个类继承httpd,然后把必须的参数给到httpd,有数据了就会调用到on\_request函数中,我们调用on\_response进行响应即可;主函数就更简单了,实例化shttpd就可以。 ### 核心源码在于httpd.cpp中,有几个地方需要说明下: 构造函数 ![](https://img.kancloud.cn/95/ad/95ad7e4673fae8ced009932dcdbcfcde_832x272.png) ### 构造函数中会初始化ssl\_,true表示https,false表示http,然后在builder中启动服务器,builder根据ssl\_确定是否要初始ssl: ![](https://img.kancloud.cn/88/00/88008e4df9b4461647b1094d79bcad53_832x318.png) ### evhttp\_new是实例化一个http对象; ### evhttp\_set\_cb可以根据URI来设置回调函数,比如”/app”; ### ssl\_init 实际上是和openssl有关系: ![](https://img.kancloud.cn/85/f0/85f09d214acf10362d31f367b04d110a_832x360.png) ### 基本就是初始化,设置证书,设置密钥等操作。 ### HTTP是一个请求/响应的逻辑,httpd中设置了响应的超时时间3500ms,如果超时了,那么会自动回复客户端一个错误,这个时间可以在on\_request中进行修改: ``` void httpd::on_request(struct evhttp_request *req, const char *tag) ``` 其中有一句代码: session->ticks = 35; // 35 \* 100ms