/** In this a Hello World example using the bundled HTTP / WebSockets extension. Compile using: NAME=http make Or test the `poll` engine's performance by compiling with `poll`: FIO_POLL=1 NAME=http make Run with: ./tmp/http -t 1 Benchmark with keep-alive: ab -c 200 -t 4 -n 1000000 -k http://127.0.0.1:3000/ wrk -c200 -d4 -t1 http://localhost:3000/ Benchmark with higher load: ab -c 4400 -t 4 -n 1000000 -k http://127.0.0.1:3000/ wrk -c4400 -d4 -t1 http://localhost:3000/ */ /* include the core library, without any extensions */ #include #include #include /* defined later */ void initialize_cli(int argc, char const *argv[]); /* ***************************************************************************** HTTP request / response handling ***************************************************************************** */ static void on_http_request(http_s *h) { /* set a response and send it (finnish vs. destroy). */ http_send_body(h, "Hello World!", 12); } /* ***************************************************************************** The main function ***************************************************************************** */ int main(int argc, char const *argv[]) { initialize_cli(argc, argv); /* listen for inncoming connections */ if (http_listen(fio_cli_get("-p"), fio_cli_get("-b"), .on_request = on_http_request, .max_body_size = fio_cli_get_i("-maxbd"), .public_folder = fio_cli_get("-public"), .log = fio_cli_get_bool("-log"), .timeout = fio_cli_get_i("-keep-alive")) == -1) { /* listen failed ?*/ perror( "ERROR: facil.io couldn't initialize HTTP service (already running?)"); exit(1); } fio_start(.threads = fio_cli_get_i("-t"), .workers = fio_cli_get_i("-w")); return 0; } /* ***************************************************************************** CLI helpers ***************************************************************************** */ void initialize_cli(int argc, char const *argv[]) { /* **** Command line arguments **** */ fio_cli_start( argc, argv, 0, 0, NULL, // Address Binding arguments FIO_CLI_PRINT_HEADER("Address Binding:"), FIO_CLI_INT("-port -p port number to listen to. defaults port 3000"), "-bind -b address to listen to. defaults any available.", // Concurrency arguments FIO_CLI_PRINT_HEADER("Concurrency:"), FIO_CLI_INT("-workers -w number of processes to use."), FIO_CLI_INT("-threads -t number of threads per process."), // HTTP Settings arguments FIO_CLI_PRINT_HEADER("HTTP Settings:"), "-public -www public folder, for static file service.", FIO_CLI_INT( "-keep-alive -k HTTP keep-alive timeout (0..255). default: 10s"), FIO_CLI_INT( "-max-body -maxbd HTTP upload limit in Mega Bytes. default: 50Mb"), FIO_CLI_BOOL("-log -v request verbosity (logging)."), // WebSocket Settings arguments FIO_CLI_PRINT_HEADER("WebSocket Settings:"), FIO_CLI_INT("-ping websocket ping interval (0..255). default: 40s"), FIO_CLI_INT("-max-msg -maxms incoming websocket message " "size limit in Kb. default: 250Kb"), "-redis -r an optional Redis URL server address.", FIO_CLI_PRINT("\t\ta valid Redis URL would follow the pattern:"), FIO_CLI_PRINT("\t\t\tredis://user:password@localhost:6379/")); /* Test and set any default options */ if (!fio_cli_get("-p")) { /* Test environment as well */ char *tmp = getenv("PORT"); if (!tmp) tmp = "3000"; /* Set default (unlike cmd line arguments, aliases are manually set) */ fio_cli_set("-p", tmp); fio_cli_set("-port", tmp); } if (!fio_cli_get("-b")) { char *tmp = getenv("ADDRESS"); if (tmp) { fio_cli_set("-b", tmp); fio_cli_set("-bind", tmp); } } if (!fio_cli_get("-public")) { char *tmp = getenv("HTTP_PUBLIC_FOLDER"); if (tmp) { fio_cli_set("-public", tmp); fio_cli_set("-www", tmp); } } if (!fio_cli_get("-public")) { char *tmp = getenv("REDIS_URL"); if (tmp) { fio_cli_set("-redis-url", tmp); fio_cli_set("-ru", tmp); } } }