| #include "app.hpp" | |
| #include <functional> | |
| #include <memory> | |
| #include <utility> | |
| #include "redfish_devpath_injector.hpp" | |
| #include "http_request.hpp" | |
| #include "http_response.hpp" | |
| #include "http_server.hpp" | |
| #include "logging.hpp" | |
| #include "async_resp.hpp" | |
| #include "request_stats.hpp" | |
| namespace crow { | |
| #ifdef BMCWEB_ENABLE_SSL | |
| using ssl_context_t = boost::asio::ssl::context; | |
| using ssl_socket_t = boost::beast::ssl_stream<boost::asio::ip::tcp::socket>; | |
| using ssl_server_t = Server<App, ssl_socket_t>; | |
| #else | |
| using socket_t = boost::asio::ip::tcp::socket; | |
| using server_t = Server<App, socket_t>; | |
| #endif | |
| #ifdef BMCWEB_ENABLE_SSL | |
| std::unique_ptr<ssl_server_t> sslServer; // NOLINT | |
| #else | |
| std::unique_ptr<server_t> server; // NOLINT | |
| #endif | |
| void App::run() { | |
| #ifdef BMCWEB_ENABLE_SSL | |
| if (-1 == socketFd) { | |
| sslServer = std::make_unique<ssl_server_t>(this, bindaddrStr, portUint, | |
| sslContext, io); | |
| } else { | |
| sslServer = std::make_unique<ssl_server_t>(this, socketFd, sslContext, io); | |
| } | |
| sslServer->run(); | |
| #else | |
| if (-1 == socketFd) { | |
| server = | |
| std::make_unique<server_t>(this, bindaddrStr, portUint, nullptr, io); | |
| } else { | |
| server = std::make_unique<server_t>(this, socketFd, nullptr, io); | |
| } | |
| server->run(); | |
| #endif | |
| } | |
| void App::debugPrint() | |
| { | |
| BMCWEB_LOG_DEBUG << "Routing:"; | |
| router->DebugPrint(); | |
| } | |
| void App::handle(Request& req, | |
| const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { | |
| // allocate a requestStatsContext to track this request: | |
| asyncResp->requestStatsContext = | |
| std::make_shared<managedStore::RequestStatsContext>( | |
| managedStore::RequestStatsContext::queryURLKeyFor(req.method(), | |
| req.url())); | |
| BMCWEB_LOG_INFO << "App: handle: " | |
| << asyncResp->requestStatsContext->toJson(); | |
| if (devpathInjector != nullptr) { | |
| std::function<void(Response&)> origHandler = | |
| asyncResp->res.releaseCompleteRequestHandler(); | |
| asyncResp->res.setCompleteRequestHandler( | |
| [injector = devpathInjector, req, | |
| origHandler = std::move(origHandler)](Response& res) { | |
| injector->Inject(req, res); | |
| if (origHandler) { | |
| origHandler(res); | |
| } | |
| }); | |
| } | |
| router->Handle(req, asyncResp); | |
| } | |
| } // namespace crow |