BmcWeb是OpenBMC的一个核心模块,对外负责响应Redfish请求,并且由于OpenBMC的Web使用的Redfish api,所以BmcWeb也是Web的后台。
1.main函数
//src\webserver_main.cpp
#include "webserver_run.hpp"
int main(int /*argc*/, char** /*argv*/) noexcept(false)
{
return run();
}
2.main函数调用的run函数
//src\webserver_run.cpp
int run()
{
boost::asio::io_context& io = getIoContext();
App app;
...
}
//include\io_context_singleton.hpp
inline boost::asio::io_context& getIoContext()
{
static boost::asio::io_context io;
return io;
}
这里getIoContext相当于一个单例模式,用于产生一个io对象
然后实例化app对象
3.App类
//http\app.hpp
namespace crow
{
class App
{
public:
using raw_socket_t = boost::asio::ip::tcp::socket;
using server_type = Server<App, raw_socket_t>;
...
std::optional<server_type> server;
};
} // namespace crow
using App = crow::App;
App这个类里面有一optional<server_type>类型的对象server
在实例化app对象时,目前还没有真正的实例化serrver对象
4.Server类
//http\http_server.hpp
namespace crow
{
struct Acceptor
{
boost::asio::ip::tcp::acceptor acceptor;
HttpType httpType;
};
template <typename Handler, typename Adaptor = boost::asio::ip::tcp::socket>
class Server
{
using self_t = Server<Handler, Adaptor>;
public:
Server(Handler* handlerIn, std::vector<Acceptor>&& acceptorsIn) :
acceptors(std::move(acceptorsIn)),
// NOLINTNEXTLINE(misc-include-cleaner)
signals(getIoContext(), SIGINT, SIGTERM, SIGHUP), handler(handlerIn)
{}
...
private:
boost::asio::signal_set signals;
Handler* handler;
};
} // namespace crow
Server类是个模版类,类的实例化传入了App和boost::asio::ip::tcp::socket两个模版参数
其中App类作为Handler的模版实参,用于定义一个反向指回App类的handler类指针
构造函数的std::vector<Acceptor>&& acceptorsIn参数后续再进行解释
signals设置了进程响应的几个信号