// SPDX-License-Identifier: GPL-3.0+
#include "common.h"
// this file includes 3 web servers:
//
// 1. single-threaded, based on select()
// 2. multi-threaded, based on poll() that spawns threads to handle the requests, based on select()
// 3. static-threaded, based on poll() using a fixed number of threads (configured at netdata.conf)
WEB_SERVER_MODE web_server_mode = WEB_SERVER_MODE_STATIC_THREADED;
// --------------------------------------------------------------------------------------
WEB_SERVER_MODE web_server_mode_id(const char *mode) {
if(!strcmp(mode, "none"))
return WEB_SERVER_MODE_NONE;
else if(!strcmp(mode, "single") || !strcmp(mode, "single-threaded"))
return WEB_SERVER_MODE_SINGLE_THREADED;
else if(!strcmp(mode, "static") || !strcmp(mode, "static-threaded"))
return WEB_SERVER_MODE_STATIC_THREADED;
else // if(!strcmp(mode, "multi") || !strcmp(mode, "multi-threaded"))
return WEB_SERVER_MODE_MULTI_THREADED;
}
const char *web_server_mode_name(WEB_SERVER_MODE id) {
switch(id) {
case WEB_SERVER_MODE_NONE:
return "none";
case WEB_SERVER_MODE_SINGLE_THREADED:
return "single-threaded";
case WEB_SERVER_MODE_STATIC_THREADED:
return "static-threaded";
default:
case WEB_SERVER_MODE_MULTI_THREADED:
return "multi-threaded";
}
}
// --------------------------------------------------------------------------------------
// API sockets
static LISTEN_SOCKETS api_sockets = {
.config_section = CONFIG_SECTION_WEB,
.default_bind_to = "*",
.default_port = API_LISTEN_PORT,
.backlog = API_LISTEN_BACKLOG
};
int api_listen_sockets_setup(void) {
int socks = listen_sockets_setup(&api_sockets);
if(!socks)
fatal("LISTENER: Cannot listen on any API socket. Exiting...");
return socks;
}
// --------------------------------------------------------------------------------------
// access lists
SIMPLE_PATTERN *web_allow_connections_from = NULL;
SIMPLE_PATTERN *web_allow_streaming_from = NULL;
SIMPLE_PATTERN *web_allow_netdataconf_from = NULL;
// WEB_CLIENT_ACL
SIMPLE_PATTERN *web_allow_dashboard_from =