LibEventServer::LibEventServer(const ServerOptions &options) : Server(options.m_address, options.m_port, options.m_numThreads), m_accept_sock(options.m_serverFD), m_accept_sock_ssl(options.m_sslFD), m_dispatcher(options.m_numThreads, RuntimeOption::ServerThreadRoundRobin, RuntimeOption::ServerThreadDropCacheTimeoutSeconds, RuntimeOption::ServerThreadDropStack, this, RuntimeOption::ServerThreadJobLIFOSwitchThreshold, RuntimeOption::ServerThreadJobMaxQueuingMilliSeconds, kNumPriorities, Util::num_numa_nodes()), m_dispatcherThread(this, &LibEventServer::dispatch) { m_eventBase = event_base_new(); m_server = evhttp_new(m_eventBase); m_server_ssl = nullptr; evhttp_set_connection_limit(m_server, RuntimeOption::ServerConnectionLimit); evhttp_set_gencb(m_server, on_request, this); #ifdef EVHTTP_PORTABLE_READ_LIMITING evhttp_set_read_limit(m_server, RuntimeOption::RequestBodyReadLimit); #endif m_responseQueue.create(m_eventBase); if (!options.m_takeoverFilename.empty()) { m_takeover_agent.reset(new TakeoverAgent(options.m_takeoverFilename)); } }
bool LibEventServer::enableSSL(void *sslCTX, int port) { #ifdef _EVENT_USE_OPENSSL m_server_ssl = evhttp_new_openssl_ctx(m_eventBase, sslCTX); if (m_server_ssl == nullptr) { Logger::Error("evhttp_new_openssl_ctx failed"); return false; } m_port_ssl = port; evhttp_set_connection_limit(m_server_ssl, RuntimeOption::ServerConnectionLimit); evhttp_set_gencb(m_server_ssl, on_request, this); return true; #else Logger::Error("A SSL enabled libevent is required"); return false; #endif }
LibEventServer::LibEventServer(const std::string &address, int port, int thread) : Server(address, port, thread), m_accept_sock(-1), m_accept_sock_ssl(-1), m_dispatcher(thread, RuntimeOption::ServerThreadRoundRobin, RuntimeOption::ServerThreadDropCacheTimeoutSeconds, RuntimeOption::ServerThreadDropStack, this, RuntimeOption::ServerThreadJobLIFOSwitchThreshold), m_dispatcherThread(this, &LibEventServer::dispatch) { m_eventBase = event_base_new(); m_server = evhttp_new(m_eventBase); m_server_ssl = nullptr; evhttp_set_connection_limit(m_server, RuntimeOption::ServerConnectionLimit); evhttp_set_gencb(m_server, on_request, this); #ifdef EVHTTP_PORTABLE_READ_LIMITING evhttp_set_read_limit(m_server, RuntimeOption::RequestBodyReadLimit); #endif m_responseQueue.create(m_eventBase); }
bool LibEventServer::enableSSL(int port) { #ifdef _EVENT_USE_OPENSSL SSL_CTX *sslCTX = nullptr; struct ssl_config config; if (RuntimeOption::SSLCertificateFile != "" && RuntimeOption::SSLCertificateKeyFile != "") { config.cert_file = (char*)RuntimeOption::SSLCertificateFile.c_str(); config.pk_file = (char*)RuntimeOption::SSLCertificateKeyFile.c_str(); sslCTX = (SSL_CTX *)evhttp_init_openssl(&config); if (sslCTX && !RuntimeOption::SSLCertificateDir.empty()) { ServerNameIndication::load(RuntimeOption::SSLCertificateDir, LibEventServer::certHandler); // Register our per-request server name indication callback. // We register our callback even if there's no additional certs so that // a cert added in the future will get picked up without a restart. SSL_CTX_set_tlsext_servername_callback( sslCTX, ServerNameIndication::callback); } } else { Logger::Error("Invalid certificate file or key file"); } m_server_ssl = evhttp_new_openssl_ctx(m_eventBase, sslCTX); if (m_server_ssl == nullptr) { Logger::Error("evhttp_new_openssl_ctx failed"); return false; } m_port_ssl = port; evhttp_set_connection_limit(m_server_ssl, RuntimeOption::ServerConnectionLimit); evhttp_set_gencb(m_server_ssl, on_request, this); return true; #else Logger::Error("A SSL enabled libevent is required"); return false; #endif }