void init_socket_address(const ConnectorOptions& options) { auto iface = net::NetworkInterface::for_name(options.get_network_interface_name()); const auto& ip_address = iface.get_first_address(net::AddressFamily::IPv4); m_socket_address = net::SocketAddress(ip_address, options.get_port()); m_option_array.emplace_back(MHD_OptionItem{ MHD_OPTION_SOCK_ADDR, intptr_t(0), static_cast<void*>(const_cast<struct sockaddr*>(m_socket_address.addr())) }); log_info("rest", "Starting connector listening on " << m_socket_address << " (" << options.get_network_interface_name() << ")"); }
void init_threading_mode(const ConnectorOptions& options){ if (ConnectorOptions::ThreadMode::SELECT == options.get_thread_mode()) { m_flags |= MHD_USE_SELECT_INTERNALLY; const auto thread_pool_size = options.get_thread_pool_size(); if (thread_pool_size > 0) { m_option_array.emplace_back(MHD_OptionItem{ MHD_OPTION_THREAD_POOL_SIZE, static_cast<intptr_t>(thread_pool_size), nullptr }); } } else if (ConnectorOptions::ThreadMode::THREAD_PER_CONNECTION == options.get_thread_mode()) { m_flags |= MHD_USE_THREAD_PER_CONNECTION; } }
void init_ssl_options(const ConnectorOptions& options) { if (options.use_ssl()) { m_flags |= MHD_USE_SSL; #ifdef ENABLE_HTTPS auto* cert_manager = psme::rest::server::CertManager::get_instance(); cert_manager->load_certs(options.get_port(), options.is_client_cert_required(), options.get_certs_dir()); const auto port = options.get_port(); m_option_array.emplace_back(MHD_OptionItem{ MHD_OPTION_HTTPS_MEM_KEY, intptr_t(0), static_cast<void*> (const_cast<char*> (cert_manager->get_server_key(port))) }); m_option_array.emplace_back(MHD_OptionItem{ MHD_OPTION_HTTPS_MEM_CERT, intptr_t(0), static_cast<void*> (const_cast<char*> (cert_manager->get_server_cert(port))) }); m_option_array.emplace_back(MHD_OptionItem{ MHD_OPTION_HTTPS_PRIORITIES, intptr_t(0), static_cast<void*> (const_cast<char*> ("NORMAL:-VERS-SSL3.0")) }); if (options.is_client_cert_required()) { m_option_array.emplace_back(MHD_OptionItem{ MHD_OPTION_HTTPS_MEM_TRUST, intptr_t(0), static_cast<void*> (const_cast<char*> (cert_manager->get_ca_cert(port))) }); } #endif } }
void init_threading_mode(const ConnectorOptions& options) { switch (options.get_thread_mode()) { case ConnectorOptions::ThreadMode::THREAD_PER_CONNECTION: m_flags |= MHD_USE_THREAD_PER_CONNECTION; break; case ConnectorOptions::ThreadMode::SELECT: { m_flags |= MHD_USE_SELECT_INTERNALLY; auto thread_pool_size = options.get_thread_pool_size(); if (0 == thread_pool_size) { thread_pool_size = std::max(std::thread::hardware_concurrency(), 1u); } log_debug("rest", "connector on port " << options.get_port() << " thread_pool_size: " << thread_pool_size); m_option_array.emplace_back(MHD_OptionItem{ MHD_OPTION_THREAD_POOL_SIZE, static_cast<intptr_t>(thread_pool_size), nullptr }); } break; default: break; } }
void init_debug_options(const ConnectorOptions& options){ if (options.use_debug()) { m_flags |= MHD_USE_DEBUG; } }